Реализации алгоритмов/Сортировка/Быстрая: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Pascal: исправление, оформление
Строка 526:
 
== [[w:Pascal|Pascal]] ==
 
В данном примере показан наиболее полный вид алгоритма, очищенный от особенностей, обусловленных применяемым языком. В комментариях показано несколько вариантов. Представленный вариант алгоритма выбирает опорный элемент псевдослучайным образом, что, теоретически, сводит вероятность возникновения самого худшего или приближающегося к нему случая к минимуму. Недостаток его — зависимость скорости алгоритма от реализации генератора псевдослучайных чисел. Если генератор работает медленно или выдаёт плохие последовательности ПСЧ, возможно замедление работы. В комментарии приведён вариант выбора среднего значения в массиве — он проще и быстрее, хотя, теоретически, может быть хуже.
 
Строка 572 ⟶ 571 :
 
procedure quicksort(var a: list; Lo,Hi: integer);
 
var
num: array[1..max] of integer; { дополнительный массив для хранения индексов }
 
procedure sort(l,r: integer);
Строка 685 ⟶ 687 :
 
=== Частично рекурсивная реализация ===
Реализация на языке pascal с одной рекурсивной ветвью.
 
Реализация на языке pascal с одной рекурсивной ветвью.
После разделения массива меньшая часть сортируется рекурсивным вызовом,
а бо'льшая -бо’льшая — в цикле. Это гарантирует глубину рекурсии не более lg(N).
 
<source lang="pascal">
Строка 706 ⟶ 707 :
end;
until i>j;
if (j - low) < (high - i) then begin // Сравнение размеров выделенных подмассивов
if low < j then qSort(ar, low, j); // Если первый подмассив меньше - он сортируется рекурсивно,
low := i; // а для следующего прохода цикла выбирается второй подмассив.
end
else begin // в противном случае всё наоборот
if i < high then qSort(ar, i, high); // Рекурсивно сортируется второй подмассив,
high := j; // а в следующем проходе цикла - первый.
end;
until low = high;
end;