Сравнение эффективности методов сортировки массивов
Рассмотрение процесса перегруппировки заданного множества объектов в некотором определенном порядке для облегчения последующего поиска элементов. Анализ и сравнение эффективности метода прямого выбора и метода сортировки с помощью дерева, их алгоритмы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 30.09.2013 |
Размер файла | 26,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Лабораторная работа № 1
Сравнить эффективность методов сортировки массивов:
Метод прямого выбора и метод сортировки с помощью дерева.
Сортировка с помощью прямого выбора
Этот прием основан на следующих принципах:
1. Выбирается элемент с наименьшим ключом.
2. Он меняется местами с первым элементом ai.
3. Затем этот процесс повторяется с оставшимися n-1 элементами, n-2 элементами и т.д. до тех пор, пока не останется один, самый большой элемент.
Процесс работы этим методом с теми же восемью ключами приведен ниже. Алгоритм формулируется так:
FORi:=ITO n-1 DO
присвоить k индекс наименьшего из a[i],,, a[nJ; поменять местами a[i] и a[j];
end
метод сортировка алгоритм
Такой метод - его называют прямым выбором - в некотором смысле противоположен прямому включению. При прямом включении на каждом шаге рассматриваются только один очередной элемент исходной последовательности и все элементы готовой последовательности, среди которых отыскивается точка включения; при прямом выборе для поиска одного элемента с наименьшим ключом просматриваются все элементы исходной последовательности и найденный помещается как очередной элемент в готовую последовательность. Полностью алгоритм прямого выбора приводится в прогр.
Пример сортировки с помощью прямого выбора
Начальные ключи
44 55 12 42 94 18 06 67
06 55 12 42 94 18 44 67
06 12 55 42 94 18 44 67
06 12 18 42 94 55 44 67
05 12 18 42 94 55 44 67
05 12 13 42 44 55 94 67
06 12 18 42 44 55 94 67
06 12 18 42 44 55 67 94
PROCEDURE StraightSfcleclion;
VAR i,j,k: index; x: item; BEGIN
FORi:=1 TO n-1 DO k:= i; x := a[i]; FORj:= i+1TO n DO
IF a[j]<xTHEN k:=j; X:= a[k] END BND; а[k] := а[i]; a[i] ; = x END END StraightSelection
Анализ прямого выбора. Число сравнений ключей (С), очевидно, не зависит от начального порядка ключей. Можно сказать, что в этом смысле поведение этого метода менее естественно, чем поведение прямого включения. Для С имеем
с = (n2 - n)/2
Число перестановок минимально
Mmin=3*(n-l)
в случае изначально упорядоченных ключей и максимально
Mmax = n2/4 +3(n-1)
если первоначально ключи располагались в обратном порядке. Для того чтобы определить Mavg, мы должны рассуждать так. Алгоритм просматривает массив, сравнивая каждый элемент с только что обнаруженной минимальной величиной; если он меньше первого, то выполняется некоторое присваивание. Вероятность, что второй элемент окажется меньше первого, равна 1/2, с этой же вероятностью происходят присваивания минимуму. Вероятность, что третий элемент окажется меньше первых двух, равна 1/3, а вероятность для четвертого оказаться наименьшим -- 1/4 и т. д. Поэтому полное ожидаемое число пересылок равно Нn--1, где Нn -- n-е гармоническое число:
Нn=1+1/2+1/3+ ... +1/nНп
можно выразить и так:
Нп = In n+g+ 1/2n -- 1/12n2 + ...
где g= 0.577216 ... --константа Эйлера. Для достаточно больших n мы можем игнорировать дробные составляющие и поэтому аппроксимировать среднее число присваиваний на i-м просмотре выражением
Fi-ln i+g+l
Среднее число пересылок Mavg в сортировке с выбором есть сумма Fi с i от 1 до n:
Mavg=n*(g+l)+(Si: 1<i<n; lni)
Вновь аппроксимируя эту сумму дискретных членов интегралом
Integral (1: п) ln x dx == x * (ln x-- 1) == n * ln (п)-- n + I
получаем, наконец, приблизительное значение
Mavg = n(ln (n) + g)
Отсюда можно сделать заключение, что, как правило, алгоритм с прямым выбором предпочтительнее строгого включения. Однако, если ключи в начале упорядочены или почти упорядочены, прямое включение будет оставаться несколько более быстрым.
Сортировка с помощью дерева
Метод сортировки с помощью прямого выбора основан на повторяющихся поисках наименьшего ключа среди n элементов, среди оставшихся n --1 элементов и т. д. Обнаружение наименьшего среди п элементов требует--это очевидно -- n -- 1 сравнения, среди n -- 1 уже нужно n -- 2 сравнений и т. д. Сумма первых n -- 1 целых равна 1/2*(n2 -- n). Как же в таком случае можно усовершенствовать упомянутый метод сортировки? Этого можно добиться, только оставляя после каждого прохода больше информации, чем просто идентификация единственного минимального элемента. Например, сделав n/2 сравнений, можно определить в каждой паре ключей меньший. С помощью n/4 сравнений -- меньший из пары уже выбранных меньших и т. д. Проделав n -- 1 сравнений, мы можем построить дерево выбора вроде представленного на рис. 2,3 и идентифицировать его корень как нужный нам наименьший ключ.
Второй этап сортировки -- спуск вдоль пути, отмеченного наименьшим элементом, и исключение его из дерева путем замены либо на пустой элемент (дырку) в самом низу, либо на элемент из соседней ветви в промежуточных вершинах). Элемент, передвинувшийся в корень дерева, вновь будет наименьшим (теперь уже вторым) ключом, и его можно исключить. После п таких шагов дерево станет пустым (т. е. в нем останутся только дырки), и процесс сортировки заканчивается. Обратите внимание -- на каждом из n шагов выбора требуется только log n сравнений. Поэтому на весь процесс понадобится порядка n*log n элементарных операций плюс еще n шагов на построение дерева. Это весьма существенное улучшение не только прямого метода, требующего п2 шагов, но и даже метода Шелла, где нужно п^1.2 шага. Естественно, сохранение дополнительной информации делает задачу более изощренной, поэтому в сортировке по дереву каждый отдельный шаг усложняется. Ведь, в конце концов, для сохранения избыточной информации, получаемой при начальном проходе, создается некоторая древообразная структура. Наша следующая задача -- найти приемы эффективной организации этой информации.
Конечно, хотелось бы, в частности, избавиться от дырок, которыми в конечном итоге будет заполнено все дерево и которые порождают много ненужных сравнений. Кроме того, надо было бы поискать такое представление дерева из п элементов, которое требует лишь п единиц памяти, а не 2n--1, как это было раньше. Этих целей действительно удалось добиться в методе Heapsort Здесь мы оставляем попытки перевести названия соответствующих методов на русский язык, ибо ни уже не более чем собственные имена, хотя в названиях первых упоминавшихся методов еще фигурировал некоторый элемент описания сути самого приема сортировки. -- Прим. перев.*) изобретенном Д. Уилльямсом, где было получено, очевидно, существенное улучшение традиционных сортировок с помощью деревьев. Пирамида определяется как последовательность ключей hi., hL+1, .. , hr, такая, что
Если любое двоичное дерево рассматривать как массив, то можно говорить, что деревья сортировок суть пирамиды, а элемент h1, в частности, их наименьший элемент: hi==min(hi, h2, ..., hn). Предположим, есть некоторая пирамида с заданными элементами hL+1, ..., hR для некоторых значений L и R и нужно добавить новый элемент х, образуя расширенную пирамиду hi., .. . ..., li R. Возьмем, например, в качестве исходной пирамиду hi, ..., hr, и добавим к ней слева элемент h1==44 Это несколько противоречит утверждению, что lu+i ..) ...hr--пирамида, но надеемся, сам читатель разберется, Что хотел сказать автор. -- Прим. перев. Новая пирамида получается так: сначала х ставится наверх древовидной структуры, а затем он постепенно опускается вниз каждый раз по направлению наименьшего из двух примыкающих к нему элементов, а сам этот элемент передвигается вверх. В приведенном примере значение 44 сначала меняется местами с 06, затем с 12 ц в результате образуется дерево, представленное на рис. 2.8. Теперь мы сформулируем этот сдвигающий алгоритм так: i, j -- пара индексов, фиксирующих элементы, меняющиеся на каждом шаге местами. Читателю остается лишь убедиться самому, что предложенный метод сдвигов действительно сохраняет неизменным условия, определяющие пирамиду.
Р. Флойдом был предложен некий «лаконичный» способ построения пирамиды «на том же месте». Его процедура сдвига представлена как программа. Здесь hi . .. hn -- некий массив, причем hi ...hn (пп = ==(nDIV2)+1) уже образуют пирамиду, поскольку индексов i, j, удовлетворяющих отношениям j = 2i (или j = 2i+1), просто не существует. Эти элементы образуют как бы нижний слой соответствующего двоичного дерева, для них никакой
PROCEDURE sift(L, R; index);
VAR i, j: index; x: item;
BEGIN i : = L; J:= 2*L; x := a[L];
IF (j < R) & (a[J+l] < a[j] THEN j:=j+l END;
WHILE (j < =R)&(a[j]<x) DO
a[i]:= a[j]: i:=j; i := 2*j;
IF(j<R)&(a[j+1]<a[j]) THEN j:=j+1 END
END
END sift
Прогр. Sift. - упорядоченности не требуется. Теперь пирамида расширяется влево; каждый раз добавляется и сдвигами ставится в надлежащую позицию новый элемент. Таблица иллюстрирует весь этот процесс, а получающаяся пирамида показана ниже.
Следовательно, процесс формирования пирамиды из п элементов hi ... hn на том же самом месте описывается так:
L :== (n DIV 2) + 1;
WHILE L > 1 DO L :== L -- 1; sift(L, n) END
Для того чтобы получить не только частичную, но и полную упорядоченность среди элементов, нужно проделать n сдвигающих шагов, причем после каждого шага на вершину дерева выталкивается очередной (наименьший) элемент. И вновь возникает вопрос: где хранить «всплывающие» верхние элементы и можно ли или нельзя проводить обращение на том же месте? Существует, конечно, такой выход: каждый раз брать последнюю компоненту пирамиды (скажем, это будет х), прятать верхний элемент пирамиды в освободившемся теперь месте, а х сдвигать в нужное место. В табл. 1 приведены необходимые в этом случае n -- 1 шагов. Сам процесс описывается с помощью процедуры sif , таким образом:
R:=n; WHILE R>1 DO х := а[l]; a[l] := a[R]; a[R] := x: R:=R-l; sift(l,R) END
Таблица 1. Построение пирамиды
44 |
55 |
12 |
42 |
94 |
18 |
06 |
67 |
|
44 |
55 |
12 |
42 |
94 |
18 |
06 |
67 |
|
44 |
55 |
06 |
42 |
94 |
18 |
12 |
67 |
|
44 |
42 |
06 |
55 |
94 |
18 |
12 |
67 |
|
06 |
42 |
12 |
55 |
94 |
18 |
44 |
67 |
Таблица 2. Пример процесса сортировки с помощью Heapsort
06 |
42 |
12 |
55 |
94 |
18 |
44 |
67 |
|
12 |
42 |
18 |
55 |
94 |
67 |
44 |
06 |
|
18 |
42 |
44 |
55 |
94 |
67 |
12 |
06 |
|
42 |
55 |
44 |
67 |
94 |
18 |
12 |
06 |
|
44 |
55 |
94 |
67 |
42 |
18 |
12 |
06 |
|
55 |
67 |
94 |
44 |
42 |
18 |
12 |
06 |
|
67 |
94 |
55 |
44 |
42 |
18 |
12 |
06 |
|
94 |
67 |
55 |
44 |
42 |
18 |
12 |
06 |
Пример из табл. 1 показывает, что получающийся порядок фактически является обратным. Однако это можно легко исправить, изменив направление «упорядочивающего отношения» в процедуре sift. В конце концов, получаем процедуру Heapsort,
PROCEDURE HeapSort; VAR L, R: index; х: item; PROCHDURE sift(L, R: index); VAR i,j:index; x: item; BEGIN i: = L; j := 2*L: x := a[L]; IF(j < R) & (a[j] < a[j+1]) THEN j := j+l END; WHILE(j<=R)&(x<a[j])DO a[i]:=a[j]; i :=j: j:=2*j: IF(J<R)&(a[i]<a[j+l]) THENj:=j+1 END END END sift;
BEGIN L:=:(nDIV2)+l:R:=n; WHILE L > 1 DO L: = L-l; sift(L, R) END; WHILER>1 DO x := a[l]; a[l] := a[R]; a[R] := x; R := R-l; sifl(L, R) END END HeapSort
Прогр. HeapsorL
Анализ Heapsort. На первый взгляд вовсе не очевидно, что такой метод сортировки дает хорошие результаты. Ведь, в конце концов, большие элементы, прежде чем попадут на свое место в правой части, сначала сдвигаются влево. И действительно, процедуру не рекомендуется применять для небольшого, вроде нашего примера, числа элементов. Для больших же n Heapsort очень эффективна; чем больше п, тем лучше она работает. Она даже становится сравнимой с сортировкой Шелла.
В худшем случае нужно п/2 сдвигающих шагов, они сдвигают элементы на log (n/2), log (п/2--1), ... ..., log(n--l) позиций (логарифм (по основанию 2)] «обрубается» до следующего меньшего целого). Следовательно, фаза сортировки требует n--1 сдвигов с самое большое log(n--1), log(n--2), ..., 1 перемещениями. Кроме того, нужно еще n --1 перемещений для просачивания сдвинутого элемента на некоторое расстояние вправо. Эти соображения показывают, что даже в самом плохом из возможных случаев Heap-sort потребует n*log n шагов. Великолепная производительность в таких плохих случаях--одно из привлекательных свойств Heapsort.
Совсем не ясно, когда следует ожидать наихудшей (или наилучшей) производительности. Но вообще-то кажется, что Heapsort «любит» начальные последовательности, в которых элементы более или менее отсортированы в обратном порядке. Поэтому ее поведение несколько неестественно. Если мы имеем дело с обратным порядком, то фаза порождения пирамиды не требует каких-либо перемещений. Среднее число перемещений приблизительно равно п/2* log(n), причем отклонения от этого значения относительно невелики.
Размещено на Allbest.ru
...Подобные документы
Изучение алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Отличительные черты сортировки включением, выбором, разделением, сортировки Шелла, обменной сортировки. Сравнение методов: плюсы и минусы.
курсовая работа [203,8 K], добавлен 03.12.2010Сортировка как процесс расстановки элементов "в некотором порядке", ее структура и основные компоненты, характеристика методов. Порядок выбора того или иного метода сортировки: линейный с обменом и подсчетом, методом Шелла, с отложенными обменами.
реферат [27,1 K], добавлен 13.09.2009Сортировка как процесс перегруппировки заданного множества объектов в некотором определенном порядке, основные этапы данного процесса. Способы формирования начальных отрезков. Описание структуры программы. Результаты испытаний, их исследование и анализ.
курсовая работа [111,6 K], добавлен 31.01.2014Обоснование выбора средства программирования. Входная и выходная информация. Основные требования к программному и аппаратному обеспечению. Анализ метода поиска в строке по алгоритму Боуера-Мура. Глобальные переменные и константы в среде Visual Studio.
курсовая работа [489,0 K], добавлен 01.07.2015Обработка массивов элементов любого типа как главное назначение алгоритмов сортировки. Анализ наиболее используемых алгоритмов сортировки: пузырьком, выбором, вставками, методом Шелла и быстрой сортировкой. Основные требования к алгоритмам сортировки.
реферат [189,8 K], добавлен 06.12.2014Анализ основных алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Сортировка пузырьком, методами вставок, выбора, методом Шелла, быстрая сортировка. Операция разделения массива внутренней сортировки.
курсовая работа [161,7 K], добавлен 17.12.2015Понятие алгоритма и сортировки. Способы и алгоритмы сортировки массивов. Быстрая сортировка Хоара. Описание алгоритма "быстрой сортировки". Реализация на языке программирования. Анализ наихудшего разбиения. Вероятностные алгоритмы быстрой сортировки.
курсовая работа [291,5 K], добавлен 22.03.2012Реализация различных методов сортировки. Алгоритмические языки программирования. Обработка большого числа единообразно организованных данных. Алгоритмы сортировки массивов. Анализ проблем реализации и использования различных видов сортировок массивов.
курсовая работа [640,3 K], добавлен 07.07.2011Понятие и основной принцип действия алгоритмов сортировки информации. Сравнительное исследование и анализ эффективности методов сортировки Шелла и Флойда в виде графиков зависимостей количества сравнений и числа перестановок элементов от объёма данных.
контрольная работа [573,6 K], добавлен 09.11.2010Разработка программы для осуществления сортировки данных методами "Выбора" с использованием языка C# и Visual Studio 2012. Плавный метод сортировки. Основные фазы сортировки во внутреннем представлении пирамиды. Программа сортировки методами выбора.
курсовая работа [637,6 K], добавлен 29.11.2014Краткое описание языка программирования С++. Алгоритм линейного выбора элемента, методов минимального (максимального) элемента и челночной сортировки. Анализ и разработка приложения, организующего сортировку массива данных пятью методами сортировки.
реферат [614,8 K], добавлен 12.04.2014Методы реализации алгоритмов сортировки и алгоритмов поиска на языках программирования высокого уровня. Программирование алгоритмов сортировки и поиска в рамках создаваемого программного средства на языке Delphi. Создание руководства пользователя.
курсовая работа [1,7 M], добавлен 16.04.2012Работа с массивами, их ввод и вывод, организация программ циклической структуры. Способы описания и использования массивов, алгоритмы их сортировки, сортировка выбором и вставками. Алгоритмы поиска элемента в неупорядоченном и упорядоченном массивах.
лабораторная работа [14,2 K], добавлен 03.10.2010Алгоритмы сортировки методами простых вставок и пузырька. Зависимость среднего времени сортировки от числа сортируемых элементов. Функции, осуществляющие сортировку любого количества элементов методом простых вставок, на основе сортировки таблицы адресов.
курсовая работа [557,1 K], добавлен 26.05.2010Описание алгоритма сортировки с двоичным включением, выбор структур данных. Пример сортировки массива, отсортированного случайным образом. Алгоритм покрытия по методу "Построение одного кратчайшего покрытия". Волновой алгоритм поиска длиннейшего пути.
курсовая работа [78,2 K], добавлен 24.09.2010Исследование основных особенностей алгоритмов быстрой и поразрядной сортировки данных. Построение графиков зависимости времени сортировки от количества элементов в файле и от степени перемешенности элементов. Описания сортировки чисел и строковых данных.
лабораторная работа [1,2 M], добавлен 23.07.2012Исследование проблемы сравнения звуковых файлов и определение степени их схожести. Сравнение файлов с использованием метода нечеткого поиска, основанного на метрике (расстоянии) Левенштейна. Сравнение MIDI-файлов и реализация алгоритмов считывания.
курсовая работа [2,0 M], добавлен 14.07.2012Определение понятия, видов и задач сортировки. Рассмотрение основ построения простых и улучшенных алгоритмов сортировки, анализ числа операций. Линейная и пирамидальная организация данных. Основные правила нижней оценки числа операций в алгоритмах.
презентация [274,5 K], добавлен 19.10.2014Принцип работы алгоритма бинарного поиска в массиве. Способы исследования алгоритма "прямое включение". Формулы зависимости числа сравнений от элементов в массиве. Графики среднего числа сравнений и перемещений практических и теоретических измерений.
курсовая работа [646,1 K], добавлен 07.01.2014Анализ структуры топологической сортировки в программной среде. Метод топологической сортировки с помощью обхода в глубину. Программа, реализующая топологическую сортировку методом Демукрона. Создание карты сайта и древовидная система разделов.
курсовая работа [1,3 M], добавлен 22.06.2011