Реализации алгоритмов/Сортировка/Быстрая: различия между версиями
Содержимое удалено Содержимое добавлено
Dm (обсуждение | вклад) →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 с одной рекурсивной ветвью.
После разделения массива меньшая часть сортируется рекурсивным вызовом,
а
<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;
|