Под сортировкой последовательности понимают процесс перестановки элементов последовательности в определенном порядке: по возрастанию, убыванию, последней цифре, сумме делителей, … .
Пусть дана последовательность элементов a1, a2, ... , an.
Элементы этой последовательности – данные произвольного типа, на котором определено отношение порядка “<” (меньше) такое, что любые два различных элемента сравнимы между собой.
Сортировка означает перестановку элементов последовательности ak1, ak2, ... , akn такую, что
ak1 < ak2 < ... < akn.
Простые сортировки
сложность O(N2)
сложность O(N·logN)
Простые сортировки
Простые сортировки
начиная снизу, сравниваем два соседних элемента; если они стоят «неправильно», меняем их местами
за 1 проход по массиву один элемент (самый маленький) становится на свое место
1-ый проход
2-ой проход
3-ий проход
Для сортировки массива из N элементов нужен
N-1 проход (достаточно поставить на свои места N-1 элементов).
2
for j:=N-1 downto 1 do
if A[j] > A[j+1] then begin
c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c;
end;
1
i-ый проход
for j:=N-1 downto i do
...
i
for i:=1 to N-1 do begin
for j:=N-1 downto i do
if A[j] > A[j+1] then begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
end;
end;
i
элементы выше A[i] уже поставлены
Эффективность метода пузырька
repeat
flag := False; { сбросить флаг }
for j:=N-1 downto 1 do
if A[j] > A[j+1] then begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
flag := True; { поднять флаг }
end;
until not flag; { выход при flag=False }
flag := False;
flag := True;
not flag;
var flag: boolean;
i := 0;
i
i := i + 1;
N-1
N
нужно N-1 проходов
поиск минимального от A[i] до A[N]
если нужно, переставляем
i+1
i
Сортировка простыми вставками
Сортировка простыми вставками
Метод прямых вставок с барьером
Метод прямых вставок с барьером
Метод прямых вставок с барьером
Метод прямых вставок с барьером
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка бинарными вставками
Сортировка Шелла
Сортировка Шелла
Сортировка Шелла
Сортировка Шелла
Сортировка Шелла
Сортировка Шелла
Сортировка Шелла
Пирамидальная сортировка
Пирамидальная сортировка: просеивание
Пирамидальная сортировка: просеивание
Пирамидальная сортировка: просеивание
Пирамидальная сортировка: просеивание
Пирамидальная сортировка
Пирамидальная сортировка: просеивание
перестановка элементов 1 и 12
Пирамидальная сортировка: просеивание
Пирамидальная сортировка: алгоритм
for i:= N downto 2 do begin Пирамидальная сортировка
x:=a[1]; a[1]:=a[i]; a[i]:=x;
j:= 1; flag:=true;
while (j<=((i-1)div 2)) and flag do begin
k:=2*j;
if (k+1<=i-1) and (a[k] k:= k+1;
if a[k]>a[j] then begin
x:=a[j]; a[j]:=a[k]; a[k]:= x;
j:= k end
else flag:=false
end
end;
Пирамидальная сортировка: пример
Пирамидальная сортировка: пример
Пирамидальная сортировка: пример
Пирамидальная сортировка: пример
Пирамидальная сортировка: пример
Пирамидальная сортировка: пример
Пирамидальная сортировка: пример
Пирамидальная сортировка
1 шаг: выбрать некоторый элемент массива X
3 шаг: так же отсортировать две получившиеся области
Разделяй и властвуй (англ. divide and conquer)
Разделение:
выбрать средний элемент массива (X=67)
установить L:=1, R:=N
увеличивая L, найти первый элемент A[L], который >= X (должен стоять справа)
уменьшая R, найти первый элемент A[R], который <= X (должен стоять слева)
если L<=R, поменять местами A[L] и A[R] и перейти
к п. 3
ограничение рекурсии
while L <= R do begin
while A[L] < X do L:= L + 1;
while A[R] > X do R:= R - 1;
if L <= R then begin
c:= A[L]; A[L]:= A[R]; A[R]:= c;
L:= L + 1; R:= R - 1;
end;
end;
разделение
обмен
двигаемся дальше
сортируем две части
procedure QSort ( first, last: integer);
...
nX := 0; { пока не нашли ...}
if nX < 1 then writeln('Не нашли...')
else writeln('A[', nX, ']=', X);
nX – номер нужного
элемента в массиве
Улучшение: после того, как нашли X, выходим из цикла.
for i:=1 to N do { цикл по всем элементам }
if A[i] = X then { если нашли, то ... }
nX := i; { ... запомнили номер}
nX := 0; i := 1;
while i <= N do begin
if A[i] = X then begin
nX := i; i := N;
end;
i := i + 1;
end;
break;
i := N;
while R >= L do begin
c := (R + L) div 2;
if X < A[c] then R := c - 1;
if X > A[c] then L := c + 1;
end;
номер среднего элемента
if X = A[c] then begin
nX := c;
R := L - 1; { break; }
end;
нашли
выйти из цикла
сдвигаем границы
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть