Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

12. Методы внутренней сортировки: Сортировка «Хаора»

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

Рассмотрим данный вид сортировке на примере:

Если алгоритм вызывается для списка, который содержит нуль или один элемент, то подписок уже отсортирован и процедура заканчивается, в противном случае выбирается один элемент, относительно которого список разбивается на две части, в первый подписок идут элементы меньше выбранного, во второй больше. И затем, как уже было сказано, она рекурсивно вызывает сама себя для сортировки обои подсписков.

procedure QuickSort( var a: array of integer; min, max: Integer);

Var

i,j,mid, tmp : integer;

Begin

if min<max then begin

mid:=A[min];

i:=min-1;

j:=max+1;

while i<j do begin

repeat

i:=i+1;

until A[i]>=mid;

repeat

j:=j-1;

until A[j]<=mid;

if i<j then begin

tmp:=A[i];

A[i]:=A[j];

A[j]:=tmp;

end;

end;

QuickSort(a, min,j);

QuickSort(a, j+1,max);

end;

end;

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

14. Методы внутренней сортировки: Пирамидальная сортировка

Метод сортировки простым выбором основан на повторном выборе наименьшего ключа среди n элементов, затем среди n-1 элементов и т.д. Понятно, что поиск наименьшего ключа из n элементов требует n-1 сравнений, а поиск его среди n-1 элементов n-2 сравнений. Улучшить сортировку выбором можно в том случае, если получать от каждого прохода больше информации, чем просто указание на один, наименьший элемент. Например, с помощью n/2 сравнений можно определить наименьший ключ из каждой пары, при помощи следующих n/4 сравнений можно выбрать наименьший из каждой пары таких наименьших ключей и т.д. Наконец при помощи всего n-1 сравнений мы можем построить дерево, как показано на рис. 1, выбора и определит корень, как наименьший ключ. На втором шаге мы спускаемся по пути, указанном наименьшим ключом, и исключаем его, последовательно заменяя либо на "дыру" (или ключ бесконечность), либо на элемент, находящийся на противоположной ветви промежуточного узла (см. рис. 2 и 3). Элемент оказывается в корне дерева, вновь имеет наименьший ключ среди оставшихся и может быть исключен. После n таких шагов дерево становится пустым (т. е. состоит из "дыр"), и процесс сортировки закончен.

Procedure Sift;

Label 13;

Var i,j:word;

BEGIN

i:=l; j:=2*i; x:=a[i];

While j<=r Do

begin

If j<r Then

If a[j].key<a[j+1].key Then j:=j+1;

If x.key>=a[j].key Then Goto 13;

a[i]:=a[j]; i:=j; j:=2*i;

end;

13: a[i]:=x

END;{Sift}