Рефераты. Анализ методов сортировки одномерного массива

Время работы алгоритма t примерно оценивается формулой:

                   t=a*NЅ + b*N + c*N*logN

  где a,b,c - неизвестные константы, зависящие от программной реализации алгоритма.

  Вставки с убывающим шагом (метод Шелла)

  Идея алгоритма состоит в обмене элементов, расположенных не только рядом, как в алгоритме простых вставок (п.1), но и далеко друг от друга,  что значительно сокращает общее число  операций  перемещения элементов.  Для примера возьмем файл из 16 элементов.  Сначала просматриваются пары с шагом 8.  Это пары  элементов  1-9,  2-10,  3-11,        4-12, 5-13, 6-14, 7-15, 8-16. Если значения элементов в паре не упорядочены по возрастанию,  то элементы меняются местами. Назовем этот этап 8-сортировкой.  Следующий этап - 4-сортировка,  на котором элементы в файле делятся на четверки:  1-5-9-13,  2-6-10-14, 3-7-11-15,4-8-12-16.  Выполняется сортировка в каждой четверке. Сортировка может выполняться методом простых  вставок  (п.1).  Следующий  этап  - 2-сортировка,  когда  элементы  в  файле  делятся  на 2 группы по 8:

 1-3-5-7-9-11-13-15 и 2-4-6-8-10-12-14-16.  Выполняется сортировка  в   каждой восьмерке.  Наконец весь файл упорядочивается методом простых  вставок.  Поскольку дальние элементы уже переместились на свое место  или находятся вблизи от него, этот этап будет значительно менее трудоемким,  чем при сор-тировке вставками без предварительных "дальних" обменов. 

 Файл после окончательной сортировки (1-сортировки): 61 87 154 170 275 426 503 509 512 612 653 677 703 765 897 908

Время работы алгоритма t примерно оценивается формулой:  t=a*N**b

        где a и b - неизвестные константы, зависящие от программной реализа-

        ции алгоритма.

                              


 Вставки в связанный список

Среди общих способов улучшения алгоритма  простых  вставок  можно рассмотреть способ, основанный на изменении структуры данных. Сортировка простыми вставками состоит из двух основных операций:

           - просмотра  исходного  файла  со сравнением переменной Х с

             элементами K[i] файла;

           - вставки нового элемента путем сдвига оставшихся элементов

             вправо.

 Файл до сих пор рассматривался как линейный список и для выполнения операции вставки в нем необходимо переместить в среднем половину эле-ментов .  Известно,  что для операций вставки  идеально  подходитсвязанный  список,  так как в этом случае вставка требует всего лишь изменения нескольких связей.  Операция  последовательного  просмотра для связанного списка почти так же проста, как и для линейного списка.  Поскольку файл всегда просматривается в одном  направлении,  то достаточно иметь список только с одной связью. С другой стороны связанное распределение делает невозможным бинарный поиск, поэтому приобретая  преимущество в  выполнении операции вставки,  мы теряем по сравнению с бинарным поиском в эффективности  операции  просмотра и сравнения.  Рассмотрим  алгоритм простых вставок на связанном вперед  списке.

Дан файл  в виде связанныого списка,  каждый элемент которого содержит кроме ключа K[i] еще и указатель на следующий  элемент  L[i].

Кроме того есть еще дополнительная переменная L[0],  содержащая указатель на последний N-й элемент файла.  Указатель L[N]  равен  нулю, что является признаком конца списка элементов.

 Время работы алгоритма t примерно оценивается формулой: t=a*NЅ + b*N

        где a,b - неизвестные константы, зависящие от программной реализации алгоритма.


 Вставки в несколько связанных списков

Идея метода основывается на предположении,  что ключи в  исходном файле имеют значения в некотором известном диапазоне MAX  и   в этом диапазоне они распределены довольно равномерно.  Тогда по аналогии с методом  вставки в один связанный список можно организовать несколько,  например,  Q списков. Величина Q зависит от ожидаемого среднего количес-тва элементов M в каждом списке то есть Q=N/M, N - количество ключей.

 При разработке программы нужно проанализировать  зависимость времени работы метода от параметра М для  различных  исходных файлов  и дать рекомендации по выбору оптимального значения.

Схема алгоритма имеет следующий вид. Через Q обозначено количество списков, массив B[1]...B[Q] служит для хранения указателей на начала отдельных списков.  Перед началом работы  алгоритма  элементы   массива В предполагаются равными 0. Каждый i-й элемент исходного файла содержит ключ K[i] и   указатель  L[i]   на    следующий  элемент  списка.  Значение L[i]=0 соответствует последнему элементу в списке,  указатель B[1] указывает на начало первого подсписка и  одновременно  на  начало всего списка.  Через minK обозначено минимальное значение ключа в файле,  через М - среднее выбранное значение количества элементов в подсписке. d - номер текущего списка, в который должен быть вставлен элемент K[j].  Величина R=MAX/Q есть диапазон значений ключей, приходящийся на один список.

 Время работы алгоритма t примерно оценивается формулой: t=a*NЅ + b*N

  где a,b - неизвестные константы, зависящие от программной реализации алгоритма.


Обменная сортировка

Название этой  группы  методов произошло от основного типа операций, используемого в алгоритмах - обмен двух элементов в файле своими значениями. Эта операция используется и в других группах, поэтому классификацию нельзя признать вполне строгой,  но данное  разделение тем не менее является традиционным.  Файл,  подлежащий сортировке, в      общем случае состоит из элементов-записей, включающих информационную часть и ключи,  по которым производится упорядочение по возрастанию.

Поскольку информационная часть почти не влияет на процесс  сортировки,  будем предполагать,  что файлы, используемые в примерах, состот только из элементов-ключей, а информационная часть записи отсутствует.


 Метод пузырька

Алгоритм довольно очевиден.

Пары стоящих рядом элементов просматриваются в направлении  снизу вверх и сравниваются. Если верхний элемент оказывается меньше нижнего, то они меняются  местами.  Продолжая этот процесс  циклически, мы в конце концов придем к отсортированному файлу.Файл расположен вертикально снизу вверх, чтобы эффект всплывающего  пузырька   выглядел более наглядно.  Элементы с большим значением ключа "всплывают" наверх,  после последовательных сравнивнений с соседними элементами.

Время работы алгоритма t примерно оценивается формулой:    t=a*NЅ + b*N

        где a,b - неизвестные константы, зависящие от программной реализа-

        ции алгоритма.

Модификация метода  пузырька

Модификация метода  пузырька состоит в том,  что файл можно просматривать как с начала до конца,  так и с конца до начала попеременно. Это несколько сокращает число перемещений элементов.

 Время работы алгоритма t примерно оценивается формулой: t=a*NЅ + b*N

где a,b - неизвестные константы, зависящие от программной реализации алгоритма.

 

 Быстрая сортировка.

Основная стратегия ускорения алгоритмов сортировка - обмены между как можно более дальними элементами исходного файла - в методе быстрой сортировки реализована за счет того, что один из ключей в исходном файле используется для разделения его на два подфайла так, чтобы слева от выбранного элемента находились только элементы  с  меньшими ключами,а справа - только с большими.  Элемент,  разделяющий файл, помещается между его двумя подфайлами и процедура выполняется рекурсивно для каждой половины до тех пор, пока в очередном новом подфайле не окажется меньше,  чем М элементов,  где М - заранее  выбранное число.

Сортировка подфайлов, содержащих меньше чем М элементов, выполняется  каким-либо простым методом, например простыми вставками. Таким образом,  реализация метода зависит от двух параметров: значения М и способа  выбора элемента,  который предназначен для разделения файла на две части.

Блок выбора Х в простейшем случае формулируется как X=K[l], однако  это  может привести к крайне неэффективному алгоритму.  Наиболее простое лучшее решение - выбирать Х как случайный ключ из  диапазона K[l] ... K[r] и обменять его с K[l].

  Время работы алгоритма t примерно оценивается формулой:              

                                          t=a*N*logN + b*N

        где a,b - неизвестные константы, зависящие от программной реализации алгоритма.


Обменная поразрядная сортировка

Данный метод использует двоичное представление ключей.  Файл сортируется  последовательно  по  битам двоичного представления ключей,начиная со старшего.  Ключи,  имеющие значение данного бита,  равноенулю, ставятся в левую половину файла, а ключи со значением бита 1 в правую. Функция b(ключ) возвращает значение ьита с номером b аргумента, m -максимальное количество значащих битов в ключах.

Время работы алгоритма t примерно оценивается формулой:t=a*N*logN + b*N

где a,b - неизвестные константы, зависящие от программной реализации алгоритма.


 Параллельная сортировка Бэтчера

Для получения алгоритма обменной сортировки, время работы которого меньше, чем NЅ, необходимо выбирать для сравнения и обмена ключи,расположенные возможно дальше друг от друга.  Эта идея уже была реализована в алгоритме сортировки Шелла вставок с убывающим шагом, однако в данном алгоритме сравнения выполняются по-другому.

Время работы алгоритма t примерно оценивается формулой:t=a*N*(logN)Ѕ

где a,b - неизвестные константы, зависящие от программной реализации алгоритма.


 Сортировка посредством выбора

Идея метода довольно проста:  найти наибольший  элемент  файла  и по-ставить  его на место N,  найти следующий максимум и поставить его на место N-1 и т.д.  до 2-го элемента.

Время работы алгоритма t примерно оценивается формулой: t=a*NЅ+b*N* logN

        где a,b - неизвестные константы, зависящие от программной реализации алгоритма.

Использование связанного списка для хранения информации о проме-жуточных максимумах.

В алгоритме максимум среди K[1] ... K[j-1] определяется в цикле от j-1 до 1 c целью обеспечить меньшее число  обменов  в  случае равенства ключей и сохранении прежнего порядка равных элементов. Однако, если изменить порядок просмотра элементов на противоположный  и изменить структуру данных, введя дополнительные указатели, можно пример-но в два раза сократить число повторений в цикле поиска  максисмума.  Каждый  ключ K[i] снабжается указателем L[i] на элемент,  максимальный  среди первых i-1 элементов .

Тогда после  обмена элементов K[j] и K[m] поиск максимума в  следующем цикле по j можно осуществлять среди элементов K[L[m]] ... K[j]  при началь-ных значениях X=K[L[m]], m=L[m], т.к. максимум может "обновиться" только за счет элементов, лежащих правее локального максимума. Таким образом среднее количество просматриваемых при поиске максимума элементов со-кращается примерно в два раза.

Страницы: 1, 2, 3, 4, 5



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.