
- •Лекция № 7
- •1. Основные виды сортировки
- •2. Алгоритмы внутренней сортировки
- •Сортировка подсчетом
- •Сортировка простым включением
- •Сортировка методом Шелла
- •Сортировка простым извлечением (выбором).
- •Сортировка методом пузырька (простого обмена)
- •Быстрая сортировка (Хоара)
- •Сортировка слиянием
- •3. Сравнение алгоритмов внутренней сортировки
- •Контрольные вопросы.
Лекция № 7
Тема: «Алгоритмы сортировки»
План лекции
1. Основные виды сортировки
2. Алгоритмы внутренней сортировки
3. Сравнение алгоритмов внутренней сортировки
1. Основные виды сортировки
Сортировка – это процесс упорядочения некоторого множества элементов, на котором определены отношения порядка >, <, ≥, ≤, =. Когда говорят о сортировке, подразумевают упорядочение множества элементов по возрастанию или убыванию. В случае наличия элементов с одинаковыми значениями, в упорядоченной последовательности они располагаются рядом друг с другом в любом порядке. Хотя иногда, бывает полезно сохранить первоначальный порядок элементов с одинаковыми значениями.
Алгоритмы сортировки имеют большое практическое применение. Их можно встретить почти везде, где речь идет об обработке и хранении больших объемов информации. Некоторые задачи обработки данных решаются проще, если данные упорядочены.
Традиционно различают внутреннюю сортировку, в которой предполагается, что данные находятся в оперативной памяти, и важно оптимизировать число действий программы (для методов, основанных на сравнении, число сравнений, обменов элементов и пр.), и внешнюю, в которой данные хранятся на внешнем устройстве с медленным доступом (диск, лента и т. д.) и, прежде всего, надо снизить число обращений к этому устройству.
2. Алгоритмы внутренней сортировки
При дальнейшем рассмотрении внутренней сортировки определим, что множество данных, которые упорядочиваются, описывается как массив фиксированной длины:
A: array[1..n] of ItemType;
Обычно тип ItemType описывает запись с некоторым полем, играющим роль ключа, а сам массив представляет собой таблицу. Так как здесь рассматривается, прежде всего, сам процесс сортировки, то будем считать, что тип ItemType включает только ключ целого типа.
Сортировка подсчетом
Суть метода заключается в том, что на каждом шаге подсчитывается, в какую позицию результирующего массива B надо записать очередной элемент исходного массива A (рис. 1). Если некоторый элемент A[i] помещается в результирующий массив в позицию k + 1, то слева от B[k + 1] должны стоять элементы меньшие или равные B[k + 1]. Значит, число k складывается из количества элементов меньших A[i] и, возможно, некоторого числа элементов, равных A[i]. Условимся, что из равных будут учитываться только те элементы, которые в исходном массиве стоят левее A[i]:
procedure NumerSort(n: integer;
var A: array [1..n] of integer);
{Процедура сортировки подсчетом}
var
i, j, k: integer;
B: array[1..n] of integer;
begin
for i := 1 to n do begin
{Вычисляем положение элемента в результирующем массиве}
k := 1;
for j := 1 to n do
if (A[j] < A[i]) or
((A[j] = A[i]) and (j < i)) then k := k+1;
{Включаем очередной элемент в результирующий массив}
B[k] := A[i];
end;
for i := 1 to n do A[i] := B[i];
end;
Рисунок 1 – Сортировка подсчетом
Легко видеть, что этот алгоритм всегда имеет временную сложность, пропорциональную O(n2) (два вложенных цикла, зависящих от n линейно и не зависящих от порядка элементов) и пространственную сложность, пропорциональную O(n) (результирующий массив). Также следует отметить, что данный алгоритм сохраняет порядок элементов с одинаковыми значениями.