- •Тема № 5. Алгоритмы сортировки. Сравнительный анализ
- •5.1. Введение
- •5.2. Описание алгоритмов
- •3.Пиромидальная сортировка (сортировка с помощью кучи).
- •4. Быстрая сортировка.
- •5.3. Теоретические аспекты определения времени выполнения сортировок
- •5.3.1 Алгоритм сортировки Insertion Sort
- •5.3.2. Алгоритм сортировки Quick Sort.
- •5.3.3. Алгоритм сортировки Heap Sort.
- •5.3.4. Алгоритм сортировки Merge Sort.
- •5.4. Практические аспекты сравнения
5.3.1 Алгоритм сортировки Insertion Sort
Время работы процедуры lNSERTION_SORTзависит от набора входных значений: для сортировки тысячи чисел требуется больше времени, чем для сортировки трех чисел. Кроме того, время сортировки с помощью этой процедуры может быть разным для последовательностей, состоящих из одного и того же количества элементов, в зависимости от степени упорядоченности этих последовательностей до начала сортировки. В общем случае время работы алгоритма увеличивается с увеличением количества входных данных, поэтому общепринятая практика — представлять время работы программы как функцию, зависящую от количества входных элементов. Для этого понятия "время работы алгоритма" и "размер входных данных" нужно определить точнее.
Наиболее адекватное понятие размера входных данных (inputsize) зависит от рассматриваемой задачи. Во многих задачах, таких как сортировка или дискретные преобразования Фурье, этоколичество входных элементов, например, размерп сортируемого массива. Для многих других задач, таких как перемножение двух целых чисел, наиболее подходящая мера для измерения размера ввода —общее количество битов, необходимых для представления входных данных в обычных двоичных обозначениях. Иногда размер ввода удобнее описывать с помощью не одного, а двух чисел. Например, если на вход алгоритма подается граф, размер ввода можно описывать, указывая количество вершин и ребер графа. Для каждой рассматриваемой далее задачи будет указываться способ измерения размера входных данных.
Время работы алгоритма для того или иного ввода измеряется в количестве элементарных операций, или "шагов", которые необходимо выполнить. Здесь удобно ввести понятие шага, чтобы рассуждения были как можно более машиннонезависимыми. На данном этапе мы будем исходить из точки зрения, согласно которой для выполнения каждой строки псеводкода требуется фиксированное время. Время выполнения различных строк может отличаться, но мы предположим, что одна и та жеi-я строка выполняется за времяci, гдеci- константа.
В последующих рассуждениях формула для выражения времени работы алгоритма Insertion_Sort, которая сначала будет сложным образом зависеть от всех величинci, значительно упростится благодаря более лаконичным обозначениям, с которыми проще работать. Эти более простые обозначения позволят легче определить, какой из двух алгоритмов эффективнее.
Начнем с того, что введем для процедуры INSERTION_SORTвремя выполнения каждой инструкции и количество их повторений. Для каждогоj = 2,3,..., п, гдеn=length [А], обозначим черезtj количество проверок условия в циклеwhile(строка 5). При нормальном завершении цикловforилиwhile(т.е. когда перестает выполняться условие, заданное в заголовке цикла) условие проверяется на один раз больше, чем выполняется тело цикла. Само собой разумеется, мы считаем, что комментарии не являются исполняемыми инструкциями, поэтому они не увеличивают время работы алгоритма:ci
Время работы алгоритма — это сумма промежутков времени, необходимых для выполнения каждой входящей в его состав исполняемой инструкции. Если выполнение инструкции длится в течение времени ci и она повторяется в алгоритмеп раз, то ее вклад в полное время работы алгоритма равноci n. Чтобы вычислить время работы алгоритмаlNSERTION_SORT(обозначим его черезТ (n)), нужно просуммировать произведения значений, стоящих в столбцахвремя иколичество раз, в результате чего получим:
(5.1)
Даже если размер входных данных является фиксированной величиной, время работы алгоритма может зависеть от степени упорядоченности сортируемых величин, которой они обладали до ввода. Например, самый благоприятный случай для алгоритма INSERTION_Sort — это когда все элементы массива уже отсортированы. Тогда для каждогоj = 2,3,...,nполучается, чтоА[i]key в строке 5, еще когдаi равно своему начальному значениюj — 1. Таким образом, приj = = 2,3,...,ntj = 1, и время работы алгоритма в самом благоприятном случае вычисляется так:
T(n)=c1n+c2(n-1)+c4(n-1)+c5(n-1)+c8(n-1)=(c1+c2+c4+c5+c8)n-(c2+c4+c5+c8) (5.2)
Это время работы можно записать как an +b, гдеа иb —константы, зависящие от величинci ;т.е. это время являетсялинейной функцией отп.
Если элементы массива отсортированы в порядке, обратном требуемому (в данном случае в порядке убывания), то это наихудший случай. Каждый элемент A [j] необходимо сравнивать со всеми элементами уже отсортированного подмножестваA [1..j— 1], так что дляj = =2,3,...,nзначенияtj = j. С учетом того, что
(как выполняется это суммирование, показано в приложении А), получаем, что время работы алгоритма lNSERTJON_SORT в худшем случае определяется соотношением
(5.3)
Это время работы можно записать как an2 + bn + с, где константы а,b и с зависят от сi. Таким образом, этоквадратичная функция отп.
Анализируя алгоритм, работающий по методу вставок, мы рассматривали как наилучший, так и наихудший случай, когда элементы массива были рассортированы в порядке, обратном требуемому. Далее мы будем уделять основное внимание определению только времени работы в наихудшем случае, т.е. максимальном времени работы извсех входных данных размера п. Тому есть три причины.
Время работы алгоритма в наихудшем случае - это верхний предел этой величины для любых входных данных. Располагая этим значением, мы точно знаем, что для выполнения алгоритма не потребуется большее количество времени. Не нужно будет делать каких-то сложных предположений о времени работы и надеяться, что на самом деле эта величина не будет превышена.
В некоторых алгоритмах наихудший случай встречается достаточно часто. Например, если в базе данных происходит поиск информации, то наихудшему случаю соответствует ситуация, когда нужная информация в базе данных отсутствует. В некоторых поисковых приложениях поиск отсутствующей информации может происходить довольно часто.
Характер поведения "усредненного" времени работы часто ничем не лучше поведения времени работы для наихудшего случая. Предположим, что последовательность, к которой применяется сортировка методом вставок, сформирована случайным образом. Сколько времени понадобится, чтобы определить, в какое место подмассива A[1..j — 1] следует поместить элементА [j]? В среднем половина элементов подмассиваA [1..J— 1] меньше, чемА [j], а половина — больше его. Таким образом, в среднем нужно проверить половину элементов подмассиваA[1..j — 1] , поэтомуtj приблизительно равноj/2. В результате получается, что среднее время работы алгоритма является квадратичной функцией от количества входных элементов, т.е. характер этой зависимости такой же, как и для времени работы в наихудшем случае. В некоторых частных случаях нас будет интересоватьсреднее время работы алгоритма, или егоматематическое ожидание.