
- •Лекция 8. Сортировка массива
- •1. Задача сортировки
- •Сортировка массивов
- •2. Простые алгоритмы сортировки
- •Сортировка обменами
- •Анализ алгоритма сортировки обменами
- •Завершаемость
- •Корректность
- •Эффективность по времени
- •Устойчивость
- •Улучшенный алгоритм сортировки обменами
- •3. Сортировка выбором
- •Анализ алгоритма сортировки выбором
- •4. Сортировка вставками
Лекция 8. Сортировка массива
Задача сортировки
Сортировка обменами.
Сортировка выбором.
Сортировка вставками (включениями).
1. Задача сортировки
Под сортировкой последовательности понимают процесс перестановки элементов последовательности в определенном порядке. Цель такого упорядочения - облегчение дальнейшей обработки данных (в частности, задачи поиска). Поэтому задача сортировки - одна из наиболее важных внутренних задач программирования.
Сортировка является идеальным примером большого множества разнообразных алгоритмов, решения одной и той же задачи. Рассматривая различные методы сортировок, видно, как изменение алгоритма приводит к новым, более эффективным по сравнению с простыми, решениям задачи сортировки.
Кроме того, последовательности можно представить различными структурами данных. Как и следует ожидать, эффективность алгоритмов оказывается сильно зависящей от реализации последовательности.
Пусть нам дана последовательность элементов a1, a2, ... , an. Элементы этой последовательности - данные произвольного типа, на котором определено отношение порядка “<<” (меньше) такое, что любые два различных элемента сравнимы. Сортировка означает перестановку элементов последовательности ak1, ak2, ... , akn такую, что
ak1 << ak2 << ... << akn.
Рассмотрим в качестве примера следующую задачу: Расположить в порядке возрастания последовательность из 4 чисел.
Сортировка массивов
Если последовательность a1, a2, ... , an реализована как массив a[1..n], вся она расположена в адресуемой памяти. Поэтому наряду с требованием эффективности по времени основное требование - экономное использование памяти. Это означает, что алгоритм не должен использовать дополнительных массивов и пересылок из массива a в эти массивы.
Постановка задачи сортировки в общем виде предполагает, что существуют только два типа действий с данными сортируемого типа: сравнение двух элементов (x < y) и пересылка элемента (x := y). Поэтому удобная мера сложности алгоритма сортировки массива a[1..n] по времени - количество сравнений C(n) и количество пересылок M(n).
Известные алгоритмы сортировки массивов делятся на простые и быстрые (эффективные). Независимо от принадлежности тому или иному классу, и простые, и быстрые алгоритмы используются на практике.
2. Простые алгоритмы сортировки
Простые алгоритмы сортировки имеют квадратичную оценку сложности по времени (T(n)= O(n2)) Мы рассмотрим три таких алгоритма: сортировку обменом, сортировку выбором и сортировку включениями.
Сортировка обменами
Основное действие сортировки обменами - сравнение двух элементов (чаще всего рядом стоящих) и, если результат сравнения отрицателен, перестановка их местами:
Если при i < j a[i] > a[j] то переставить a[i] и a[j]. В наиболее простом варианте сравниваются рядом стоящие элементы a[j] и a[j+1] :
Program BublSort;
Const n = 100;
Var a : array[1..n] of Real;
i, j : Integer; b : Real;
Begin
{ Блок ввода массива }
For i := n - 1 downto 1 do
For j := 1 to i do
If a[j] > a[j+1] then
begin
b := a[j+1]; a[j+1] := a[j]; a[j] := b
end;
{ Блок вывода массива }
End.
Рис 1. Алгоритм сортировки обменами
Алгоритм BublSort осуществляет n-1 линейный просмотр массива а. В результате каждого просмотра наибольший элемент просмотренной части массива «всплывает» на последнее место. Первый просмотр осуществляется во всем массиве, а каждый следующий – в диапазоне, на единицу меньшем. Таким образом, правая часть массива становится упорядоченной. На рисунке эти элементы – от a[k] до a[n] - заштрихованы серым. На каждом шаге просмотра сравниваются два рядом стоящих элемента. На рисунке – это элементы a[i] и a[i+1]. Если они расположены неправильно, алгоритм меняет их местами.