Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
25.04.2015
Размер:
3.01 Кб
Скачать
{$mode objfpc}

var
a: array of integer;
n, i: integer;

procedure swap(var i, j: integer);
var t: integer;
begin
t := i; i := j; j := t;
end;

procedure qsort(l, r: integer);
var
i, j: integer;
x: integer;
begin
write(l, ' ', r, ': ');
for i := l to r do
write(a[i], ' ');
writeln;

x := a[l + random(r-l+1)]; // берём сам элемент, а не его индекс
i := l;
j := r;
while i < j do begin // Theta(r-l+1)
while a[i] < x do inc(i); // выхода за пределы массива не произойдёт
while a[j] > x do dec(j);
if i <= j then begin
swap(a[i], a[j]);
inc(i);
dec(j);
end;
end;
if l < j then qsort(l, j);
if i < r then qsort(i, r);
end;

begin
randomize;
read(n);
setlength(a, n);
for i := 0 to n-1 do
read(a[i]);

qsort(0, n-1);

for i := 0 to n-1 do
write(a[i], ' ');
writeln;
end.

{
Кормэн
Ахо, Хопкрофт, Ульман "Структуры данных и алгоритмы"

Быстрая сортировка (quick sort)

1. x - опорный элемент
2. <= x | >= x
3. рекурсивно отсортировать две половинки

Как выполнить шаг 2?

Анализ времени работы
Худший случай: в качестве опорного выбирается наибольший элемент (наименьший элемент)

T(n) = T(n-1) + Theta(n)
т.е. по поределению Theta
существует c > 0, n0:
если рассматривать n > n0:
T(n) <= T(n-1) + cn;
T(n) <= cn + c(n-1) + c(n-2) + ... + c(n0+1) + c1 <= cn(n-1)/2
T(n) = O(n^2);

В лучшем случае:
опорный элемент выбирается средним по значению (б/д)
T(n) <= T(ceil(n/2)) + T(floor(n/2)) + cn
=> T(n) = O(nlogn)
1. как в сортировке слиянием
2. методом математической индукции

Классификация алгоритмов сортировки:
- по асимптотической сложности O(n^2) (пузырёк, сортировка вставками, сортировка обемном),
O(nlogn) (сортиовка слиянием)
O(nlogn) в среднем (быстрая сортировка)
O(n+m) (карманная сортировка)
- по характеру сортируемых элементов
- сортировки, основанные на сравнениях
- сортировки элементов из ограниченного диапазона (карманная сортировка)
- сортировки, основанные на разрядах (radix sort)
}















Соседние файлы в папке 13_sort