Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-практическое пособие ПРОГ.doc
Скачиваний:
35
Добавлен:
20.11.2019
Размер:
5.63 Mб
Скачать

7.2.Алгоритмы сортировки

Сортировкой, или упорядочиванием списка объектов называется расположение этих объектов по возрастанию или убыванию согласно определенному отношению линейного порядка. Различают внутреннюю и внешнюю сортировки. Если речь идет о внутренней сортировке, то предполагается, что все данные помещаются в оперативную память компьютера. Если речь идет о внешней сортировке, то объем данных слишком большой, чтобы все они поместились в оперативную память. Все это приводит к разнообразным методам сортировки.

Большая часть данного раздела посвящена рассмотрению алгоритмов внутренней сортировки. В качестве объекта сортировки рассматривается массивов, т.е. сортируемые данные размещаются в оперативной памяти, организованной линейно. В разделе рассматриваются следующие алгоритмы внутренней сортировки:

  • сортировка методом пузырька;

  • сортировка вставки;

  • сортировка выбором;

  • пирамидальная сортировка;

  • быстрая сортировка.

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

Из методов внешней сортировки в данном разделе рассмотрен только метод сортировки слиянием, позволяющий объединить несколько отсортированных файлов в один.

Временная сложность алгоритмов приводится без доказательства.

7.2.1.Сортировка методом пузырька.

Одним из самых простых методов сортировки является так называемый метод пузырька. Для того чтобы легче понять идею этого метода, представим, что сортируемый массив расположен вертикально (пусть индексы возрастают снизу вверх) и в процессе сортировки «более легкие» элементы массива всплывают наверх наподобие пузырьков воздуха в жидкости. Что понимать под «более легким» элементом зависит от того, в каком порядке сортируются элементы массива. Если элементы сортируются в порядке возрастания, то «более легким» из двух элементов считается элемент с большим значением. Если же массив сортируется в порядке убывания, то «более легким» из двух элементов считается элемент с меньшим значением.

При первом проходе массива снизу вверх, берется текущий элемент массива и сравнивается с следующим элементом. Если текущий элемент «легче» следующего, то эти элементы меняются местами. После таких действий самый «легкий» элемент всплывает наверх, т.е. оказывается последним элементом массива. Можно сказать, что теперь массив разбит на две части: отсортированную часть, состоящую только из последнего элемента массива и не отсортированную часть, состоящую из первых n-1 элементов массива, где n - число элементов массива.

Далее повторяем аналогичные действия для не отсортированной части массива. После этого самый легкий элемент массива в не отсортированной части переместится на n-1 место. Отсортированная часть уже будет состоять из двух элементов (n и n-1 элементы).

Продолжая аналогичные действия, добьемся того, что весь массив будет отсортирован.

Иллюстрация работы алгоритма пузырьковой сортировки представлена на рис.7.3(а). Алгоритм представлен блок-схемой на рис.7.4(а).

Заметим, что в примере, представленном на рисунке 7.3(а), алгоритм пузырьковой сортировки выполнил четыре итерации разделения массива на отсортированную и не отсортированную части. Однако после третей итерации массив уже стал отсортированным, и можно было остановить работу алгоритма. Подобные случаи возникают, когда в массиве есть отсортированные участки. Обработка таких случаев возможна, если запоминать позицию текущего элемента, с которым был осуществлен последний обмен. Эта позиция будет определять границу отсортированной части массива. Иллюстрация работы модифицированного таким образом алгоритма пузырьковой сортировки представлена на рис.7.3(б), блок-схема алгоритма - на рис.7.4(б).

Время выполнения алгоритма сортировки методом пузырька в худшем случае равно O(n2).