1.8.2. БЫСТРАЯ СОРТИРОВКА

Следующий пример - так называемая быстрая сортировка [АХУ 79], сущность которой заключается в следующем.

Пусть требуется отсортировать множество целых чисел S. Выберем из S произвольное число X и разобьем S на три подмножества S1, S2 и S3, такие, что S1 содержит числа, которые меньше X, S2 содержит числа, равные X, а S3 содержит числа, которые больше X. Отсортируем S1, S2 и S3, пусть при этом получились упорядоченные последовательности Q1, Q2 и Q3 (сортировка множества S2 - тривиальна, ибо все его элементы равны X). Тогда мы можем соединить Q1, Q2 и Q3 в новую последовательность Q1 Q2 Q3, которая и будет решением исходной задачи.

Определим функцию QSort, которая будет сортировать поданную на вход последовательность описанным выше методом. Для разбиения исходного множества чисел на три части используется функция  Split.

$func QSort eS = eQ;

$func Split sX eS = (eS1)(eS2)(eS3);

$func Split-Aux sX (eS1)(eS2)(eS3) eS = (eS1)(eS2)(eS3);

QSort eS =

{

eS :

= ;

eS : t

= eS;

eS : sX e

= <Split sX eS> :: (eS1)(eS2)(eS3),

<QSort eS1> eS2 <QSort eS3>;

};

Split sX eS =

<Split-Aux sX ()()() eS>;

Split-Aux sX (eS1)(eS2)(eS3) eS =

eS :

{

=

(eS1)(eS2)(eS3);

sY eRest =

{

<"<" (sY)(sX)>

= <Split-Aux sX (eS1 sY)(eS2)(eS3) eRest>;

<">" (sY)(sX)>

= <Split-Aux sX (eS1)(eS2)(eS3 sY) eRest>;

= <Split-Aux sX (eS1)(eS2 sY)(eS3) eRest>;

};

};