Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Сортировка одномерного массива методом простого выбораСодержание книги
Поиск на нашем сайте
На каждом шаге находится минимальный (максимальный) неотсортированной части. Он меняется с первым элементом в неотсортированной части, после чего отсортированная часть увеличивается на один элемент. На первом шаге весь массив считается неотсортированным. Сортировка заканчивается за (n-1) шаг
Сортировка одномерного массива пузырьковым методом На каждом шаге сравниваются все соседние элементы. В случае необходимости они меняются местами. Сортировка считается законченной за nn действий или на шаге, когда не выполнено ни одной перестановки.
Сортировка больших массивов Говорят, и это подтверждается многочисленными примерами, что 90% времени работы программы.приходится на так называемые узкие места, занимающие в общем объеме программы не более 10% команд. Поиск таких мест и улучшение их временных характеристик - один из основных методов совершенствования программ. К числу таких узких мест относятся фрагменты программ, занимающиеся упорядочением достаточно объемной информации, поиском данных в больших массивах и т. п. Ниже приводится описание нескольких довольно популярных методов упорядочения числовых массивов и тексты реализующих их процедур. Желающим познакомиться более подробно с другими методами сортировки и возникающими при этом серьезными математическими проблемами мы рекомендуем книгу Д. Кнута "Искусство программирования для ЭВМ", т. 3. Пузырьковая сортировка Идея этого метода заключается в сравнении двух соседних элементов массива, в результате которого меньшее число (более легкий пузырек) перемещается на одну позицию влево. Обычно такой просмотр организуют с конца массива и после первого прохода самое маленькое число перемещается на первое место. Затем все повторяется от конца массива до второго элемента и т. д. Известна и другая разновидность обменной сортировки (bubble1), при которой также сравниваются два соседа и, если хотя бы одна из смежных пар была переставлена, просмотр начинают с самого начала. Так продолжают до тех пор, пока очередной просмотр не закончится без перестановок. Подпрограмма bubble.bas SUB BUBBLE(X(),N) FOR 1=1 TO N-l FOR J=N-1 TO I STEP -1 IF X(J-l) > X(J) THEN TMP=X(J-1): X(J-l) =X(J): X(J)=TMP END IF NEXT J NEXT I END SUB Подпрограмма bubbiei.bas SUB BUBBLE1(X(),N) M:Q=0 FOR 1=1 TO N-l IF X(I-l) > X(I) THEN TMP=X(I-1): X(I-1)=X(I): X(I)=TMP: Q=l END IF NEXT I IF Q=l THEN GOTO *M END SUB Сортировка методом отбора Идея метода отбора заключается в следующем. Находится элемент с наименьшим значением и меняется местами с первым элементом. Среди оставшихся ищется наименьший, который меняется со вторым, и т. д. Подпрограмма select.bas SUB SELECT(X(),N) FOR I=0 TO N-2 Q=0: K=I: TMP=X(I) FOR J=I+1 TO N-l IF X(J)<="" pre=""> Сортировка методом вставки Идея этого метода базируется на последовательном пополнении ранее упорядоченных элементов. На первом шаге сортируются первые два элемента. Затем на свое место среди них вставляется третий элемент. К трем упорядоченным элементам добавляется четвертый, который занимает свое место в новой четверке. И так продолжается до тех пор, пока к n-1 ранее упорядоченным элементам не присоединится последний. Примерно таким способом игроки упорядочивают свои карты при сдаче их по одной. Подпрограмма insert.bas SUB INSERT(X%(),N%) DIM I,J,TMP FOR I=1 TO N-l TMP=X(I) FOR J=I-1 TO 0 STEP -1 IF TMP > X(J) THEN EXIT FOR X(J+1)=X(J) NEXT В X(J+1)=TMP NEXT I END SUB Сортировка методом Шелла Метод Д. Л. Шелла, опубликованный в 1959 г., предлагает сортировать массив в несколько этапов. На первом этапе в сортировке участвуют достаточно далекие элементы, например, отстоящие друг от друга на восемь позиций. На втором проходе сортируются элементы, расстояние между которыми уменьшено, например до четырех. Затем упорядочиваются каждые вторые элементы и, наконец, на последнем этапе сравниваются смежные элементы. Выбор последовательно уменьшающихся шагов в методе Шелла представляет довольно сложную математическую задачу. На практике чаще всего применяют пятизвенную схему 9->5->3->2->1. Подпрограмма shell.bas SUB SHELLSORT (X%"(), N%) DIM I, J,GAP,K,XX,A(5) A(0)=9: A(l)=5: A(2)=3: A(3)=2: A(4)=l FOR K=0 TO 4 GAP=A(K) FOR I=GAP TO N-1 XX=X(I) FOR J=I-GAP TO 0 STEP -GAP IF XX >= X(J) THEN EXIT FOR X(J+GAP)=X(J) NEXT J X(J+GAP)=XX: NEXT I: NEXT К: END SUB Сортировка методом Хоара Один из самых лучших алгоритмов сортировки - быстрая сортировка (quicksort), которая была придумана в 1960 году Чарльзом Хоаром (С. A. R. Ноаге). Быстрая сортировка - замечательный пример того, как можно избежать лишних вычислений. Она работает при помощи разделения массива на большие и маленькие элементы: Quicksort
Когда этот процесс закончится, то массив будет отсортирован. Быстрая сортировка работает быстро, потому что, как только мы узнаем, что элемент меньше, чем разделитель, нам уже не нужно его сравнивать с большими элементами; аналогично, большие элементы не сравниваются с маленькими. Поэтому данный алгоритм существенно быстрее, чем такие простые методы сортировки, как сортировка вставкой или пузырьком, когда каждый элемент сравнивается напрямую со всеми остальными. Подпрограмма hoare.bas SUB HOARE(X% (),N%) QUICK X%(),0,N%-1 END SUB SUB QUICK(X%(),LEFT%,RIGHT%) DIM I,J,XX,YY I=LEFT%: J=RIGHT% XX=X((LEFT%+RIGHT%)\2) DO WHILE X%(I) < XX AND I < RIGHT%: I=I+1: WEND WHILE XX < X%(J) AND J > LEFT%: J=J-1: WEND IF I <= J THEN YY=X%(I): X%(I)=X%(J): X%(J)=YY: 1=1+1: J=J-1 END IF LOOP WHILE I <= J IF LEFT% < J THEN QUICK X%(),LEFT%,J IF I < RIGHT% THEN QUICK X%(),I,RIGHT% END SUB Поиск Алгоритмические и математические аспекты поиска достаточно сложны и их исследованию посвящены многочисленные работы. Наиболее полно эти вопросы рассматриваются в ранее упоминавшейся трилогии Д. Кнута. Мы же ограничимся самыми простыми алгоритмами и программами, позволяющими понять суть проблемы и познакомиться с некоторыми подходами к повышению эффективности поиска. В достаточно общих чертах задача поиска формулируется следующим образом. Имеется массив а, содержащий п однородных объектов (чисел, строк, записей), и нужно установить, содержится ли в нем заданный объект q. При положительном ответе следует дополнительно сообщить порядковый номер (индекс) j найденного объекта (a[j] = q). Последовательный поиск Если исходный массив а не упорядочен, то единственно разумным способом является последовательный перебор всех элементов массива и сравнение их с заданным значением. В лучшем случае мы можем получить ответ на первом же шаге, если q = а [ 1 ]. В худшем случае придется перебрать все п элементов и только после этого дать положительный или отрицательный ответ. В среднем количество проверок может оказаться порядка п/2. Функция ssearch.bas FUNCTION SSEARCH(Q,A(),N) FOR J=0 TO N-l IF Q=A(J) THEN SSEARCH=J: EXIT FUNCTION NEXT J SSEARCH=-1 END FUNCTION Бинарный поиск Бинарный поиск, суть которого была раскрыта выше на примере поимки льва в пустыне, применяется только для предварительно упорядоченных массивов. Несмотря на абсолютную прозрачность идеи деления пополам, ее программная реализация требует большой аккуратности как в использовании сравнений, так и в выборе очередного интервала поиска. FUNCTION BSEARCH(Q,A(),N) LEFT=0: RIGHT=N-1 WHILE LEFT <= RIGHT MIDDLE=(LEFT+RIGHT)\2 IF Q < A(MIDDLE) THEN RIGHT=MIDDLE-1: GOTO M IF Q > A(MIDDLE) THEN LEFT=MIDDLE+1: GOTO M BSERACH=MIDDLE: EXIT FUNCTION M:WEND BSEARCH=-1 END FUNCTION
Программа 4_02.bas 'Программа угадывания задуманного числа в интервале [0,100] DEFINT A-Z CLS LEFT=0: RIGHT=100: DO MIDDLE=(LEFT+RIGHT)\2 PRINT "Задуманное Вами число больше, чем"; MIDDLE; " (Y/N) - "; INPUT "",A$ IF RIGHT-LEFT <= 1 THEN IF A$="Y" OR A$="y" THEN PRINT "Вы задумали ";RIGHT: END ELSE PRINT "Вы задумали ";LEFT: END END IF END IF IF A$="Y" OR A$="y" THEN LEFT=MIDDLE+1 ELSE RIGHT=MIDDLE LOOP END
|
||||
Последнее изменение этой страницы: 2021-04-13; просмотров: 117; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.211.55 (0.009 с.) |