Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР Методы программирования Build1.0.pdf
Скачиваний:
98
Добавлен:
10.06.2015
Размер:
1.89 Mб
Скачать

32

4. Простейшие методы сортировки массивов

Вид занятия – лабораторная работа Цель – исследование простейших методов сортировки одномерных массивов

Продолжительность – 4 часа

Под сортировкой понимается процесс перестановки объектов какого-то множества в определённом порядке.

Цель сортировки – облегчить последующий поиск элементов в отсортированном множестве.

Поиск прототипов современных методов сортировки начался в XIX веке. Герман Холлерит в 1888 году изобрёл электрический табулятор, работа которого базировалась на принципах поразрядной сортировки.

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

Выбор алгоритма сортировки очень сильно зависит от структуры данных. Текущая лабораторная работа посвящена сортировкам массивов.

Оценка алгоритмов сортировки

Алгоритмы сортировки обычно оцениваются по 3 параметрам:

1.Время сортировки – основной параметр, характеризующий быстродействие алгоритма.

2.Память – ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных.

3.Устойчивость – устойчивая сортировка не меняет взаимного расположения равных элементов. Такое свойство может быть очень полезным, если они состоят из нескольких полей, а сортировка происходит по одному из них.

Если критерий экономии памяти принят за ограничение, то удобная мера эффективности получается при подсчёте числа C необходимых сравнений ключей и M пересылок элементов.

Числа M и C определяются функциями от числа N сортируемых элементов. Рассматриваемые сегодня алгоритмы предусматривают N2 сравнений. Это далеко не лучший показатель, поэтому все эти алгоритмы относятся к классу простых.

Сортировка простым обменом (пузырьковый метод)

Алгоритм сортировки простым обменом основан на следующем принципе: осуществляется просмотр всех элементов массива с целью выявления элемента с наименьшим весом, найденный элемент переносится в первую позицию массива, а основные элементы смещаются. На следующей итерации алгоритма процедура повторяется, но уже без учёта первого элемента, и т.п. Очень часто этот метод называют “пузырьковым”, когда элемент с наименьшим весом всплывает на поверхность.

Работа алгоритма становится нагляднее,

Рисунок 4.1.– Сортировка простым обменом

если развернуть массив по вертикали

 

 

 

33

(см. рис. 4.1).

Шейкер-сортировка

Сортировка пузырьковым методом обладает примечательным недостатком – один неправильно расположенный “лёгкий пузырёк” расположенный в “тяжёлом конце” всплывёт на место за один проход.

Например: 12,8,42,44,55,67,94,06

Неправильно расположенный элемент в “лёгком” конце массива будет опускаться за несколько проходов.

Например: 94,06,12,8,42,44,55,67

Эта неестественная асимметрия подсказывает направление улучшения алгоритма – менять направление следующих друг за другом проходов. Работа такого алгоритма продемонстрирована рисунком 4.2.

В отличие от сортировки пузырьком (которая не находит места в серьёзных программах), шейкер-сортировка с успехом применяется в тех случаях, когда заранее известно, что все элементы почти упорядочены.

44

06

06

06

06

06

06

06

55

44

44

12

12

12

12

12

12

55

55

55

55

18

18

18

42

12

12

44

44

44

44

42

94

42

42

42

42

42

42

44

18

94

67

67

18

55

55

55

06

18

18

18

67

67

67

67

67

67

94

94

94

94

94

94

Рисунок 4.2.– Шейкер-сортировка

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

Метод основан на следующем правиле:

1.Находится элемент с наименьшим ключом;

2.Он меняется местами с первым элементом a1.

Эти операции повторяются с n-1 элементами, затем с n-2, и т.д. пока не останется только один элемент – наибольший (см. рис. 4.3).

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

06

12

18

42

94

55

44

67

06

12

18

42

44

55

94

67

06

12

18

42

44

55

94

67

06

12

18

42

44

55

67

94

Рисунок 4.3. – Сортировка простым выбором

В самом общем виде алгоритм может быть сформулирован следующим образом:

FOR i:=0 TO n-1 DO

BEGIN

{ Присвоить k индекс наименьшего из a[i] … a[n]; Поменять местами a[i] и a[k]}

END;

34

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

Элементы исходного массива условно разделяются на готовую последовательность A[0], …, A[i] и входную последовательность A[i+1], …, A[n]. На каждом шаге, начиная с i=1 и увеличивая i на единицу берут i –й элемент входной последовательности и передают в готовую последовательность, вставляя его на подходящее место. Порядок работы алгоритма отражён на рисунке 4.4.

Ваш алгоритм будет выглядеть примерно так:

Var a : array [0..99] of …; begin

For i:=1 to n-1 do

Begin x:=a[i];

{вставить x в подходящее место}

End;

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

44

55

12

42

94

18

06

67

44

55

12

42

94

18

06

67

12

44

55

42

94

18

06

67

12

42

44

55

94

18

06

67

12

42

44

55

94

18

06

67

12

18

42

44

55

94

06

67

06

12

18

42

44

55

94

67

06

12

18

42

44

55

67

94

Рисунок 4.4. – Сортировка простыми вставками

Сортировка бинарными вставками

Алгоритм сортировки простыми вставками можно улучшить, пользуясь тем, что готовая последовательность A[0],…,A[i] (в которую нужно включить новый элемент) уже упорядочена. Поэтому место включения можно найти значительно быстрее.

Будем разбирать алгоритм, рассматривая его действия на i-м шаге. Как говорилось выше, последовательность к этому моменту разделена на две части: готовую A[0]...A[i] и неупорядоченную A[i+1]...A[n]. Выбираем любой элемент из неупорядоченной последовательности и сравниваем его с элементом, находящимся в центре уже отсортированной последовательности.

Рисунок 4.5.– Шаг сортировки бинарными включениями

Произведя сравнение, мы получаем важную информацию о том, в какой половине уже отсортированной последовательности должен оказаться очередной элемент. В нашем случае (см. рис. 4.5) элемент 18 меньше 44, поэтому он должен попасть левее элемента массива со значением 44. Далее операция повторяется с выбранной частью отсортированной последовательности до тех пор, пока наш элемент не попадёт в установленное место.

35

Задание

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

2.Разработайте процедуру сортировки 2-хмерного массива с применением любого из изученных вами алгоритмов сортировок. Подумайте, можно ли её сделать универсальной – способной упорядочивать произвольные N-мерные массивы.

3. Объявите одномерный массив, типизированный типом данных TPoint. type TPoint = packed record

X:Longint;

Y:Longint;

end;

Заполните массив случайными числами и разработайте процедуру сортировки упорядочивающую элементы массива одновременно по полям X и Y.

Совет. Разработайте универсальную процедуру вывода содержимого массива на экран и используйте её для оценки правильности работы ваших программ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]