
- •Оглавление
- •Комбинированный урок №13
- •Сортировка и поиск информации
- •Методы внутренней сортировки
- •Сортировки включением Сортировка прямым включением.
- •Var I,j:word;
- •X,r:integer;
- •Сортировка бинарными включениями.
- •Var I,j,l,r,m:word;
- •X:integer;
- •Сортировка выбором Прямой выбор.
- •Var I,j,k:word;
- •X:integer;
- •Обменные сортировки Сортировка прямого обмена (пузырьковая).
- •Var I,j:word;
- •X:integer;
- •Шейкерная сортировка.
- •Var j,k,l,r:word;
- •X:integer;
- •Пирамидальная сортировка.
- •Var l,r:word;X:integer;
- •Var I,j:word;
- •Обменная сортировка разделением (быстрая сортировка).
- •Var w,X:integer;
- •I,j:word;
- •Контрольные вопросы
Var I,j:word;
X:integer;
Begin
For i:=1 To n-1 Do
begin
For j:=n DownTo i Do
If a[j-1]>a[j] Then
begin
x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x
end
end
End;{Bubble_Sort}
Шейкерная сортировка.
Улучшение алгоритма - это запоминать, производится ли на данном проходе какой-либо обмен. Если нет, то это означает, что алгоритм может закончить работу. Этот процесс улучшения можно продолжить, если запомнить не только сам факт обмена, но и место (индекс) последнего обмена.
Однако внимательный программист заметит здесь странную асимметрию: один неправильно расположенный "пузырек" в "тяжелом" конце рассортированного массива всплывет на место за один проход, а неправильно расположенный элемент в "легком" конце будет опускаться на правильное место только на один шаг на каждом проходе. Изменение направления сортировки в каждом из проходов алгоритма поиска называют шейкерной сортировкой.
Для того чтобы тяжелые элементы сразу попадали вниз, пузырьковую сортировку выполняют так, чтобы направление прохода было снизу вверх, следующий проход - сверху вниз и так далее.
Procedure Shaker_Sort(n:word;Var a:array [1..100] of integer);
Var j,k,l,r:word;
X:integer;
Begin
l:=2; r:=n; k:=n;
Repeat
For j:=r DownTo l Do {проход снизу-вверх}
If a[j-1]>a[j] Then
begin
x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; k:=j;
end;
l:=k+1;
For j:=l To r Do {проход cверху-вниз}
If a[j-1]>a[j] Then
begin
x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; k:=j;
end;
r:=k-1;
Until l>r
End;{Shaker_Sort}
Пирамидальная сортировка.
Предположим, что дана пирамида с элементами hl+1, ..., hr для некоторых значений l и r и нужно добавить новый элемент x для того, чтобы сформировать расширенную пирамиду hl, ..., hr. Новый элемент x сначала помещается в вершину дерева, а затем “просеивается” по пути, на котором находятся меньшие по сравнению с ним элементы, которые одновременно поднимаются вверх; таким образом, формируется новая пирамида.
В процедуре Heap_Sort вызывается процедура Sift, которая реализует алгоритм формирования пирамиды.
Procedure Heap_Sort(n:word;Var a: array [1..100] of integer);
Var l,r:word;X:integer;
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]<a[j+1] Then j:=j+1;
If x>=a[j] Then Goto 13;
a[i]:=a[j]; i:=j; j:=2*i;
end;
13: a[i]:=x
End;{Sift}
BEGIN
l:=(n div 2)+1; r:=n;
While l>1 Do
begin
l:=l-1; Sift
end;
While r>1 Do
begin
x:=a[1]; a[1]:=a[r]; a[r]:=x;
r:=r-1; Sift
end
END;{Heap_Sort}
Обменная сортировка разделением (быстрая сортировка).
Выбирается любой произвольный элемент массива, далее массив просматривается слева направо до тех пор пока не будет найден элемент больший выбранного; а затем просмотрим его справа налево, пока не найдем элемент меньший выбранного. Найденные элементы поменяем местами. Затем продолжим процесс “просмотра с обменом”, пока два просмотра не встретятся где-то в середине массива. В результате массив разделится на две части: левую - с ключами меньшими выбранного элемента; и правую - с большими ключами. Описанный алгоритм применяется к обоим этим частям, в результате чего последовательность разбивается на 4 части. Алгоритм применяется к каждой четвертинке и т.д. Разделение заканчивается, когда в каждой части остается 1 элемент.
В процедуре Quick_Sort вызывается процедура Sort, которая реализует алгоритм разделения и обмена для одной части массива.
Procedure Quick_Sort(n:word;Var a:massiv);
Procedure Sort(l,r:word);