
246 Гл 3 Машинно-ориентированные алгоритмические языки
Собственно работа перекладывается на операции Icut и
rcut.
Выбор
Icut,
rcut
не детерминирован: взяв любой
секущий
знак
х сорта
cbar,
можно получить Icut и
rcut
как последова-
тельности таких знаков и из а, для которых выполняется усло-
вие и ^ х или соответственно и > х (в предположении, что
выбор х произведён так, что ни одна из этих подпоследователь-
ностей не пуста. Если в качестве х взять какой-нибудь знак
funct
culsorll
a (string
a)
string:
if я = О
then а
«Ise
cuHOrI1
(h ml
(rest
(a),
Jlrsl
(a)))+(first (a))
+
culsorll
(mill
{rest
(a),
Jlrsl
(a)))
function
culsorll
(a:siring)
'.siring;
begin
If isempty(a)
then
cutsonl«
a
else
culsorll
<
conc{culsortl(lciit7(rest(a),fint(a))),
prefix
{first
(a),
culsortl
(raill
(rest
(a),
first
(a)))))
end
Рис.
128.
слова а, то Icut {а) наверняка
будет
содержать его, т. е.
будет
непустым словом; однако
rcut(а)
может оказаться пустым; так
•будет,
например, в случае, когда все знаки в слове а одинако-
вы,
а значит, Icut (а) — а. Итак, для обеспечения завершения
•будет
лучше, если при условии а Ф- С) мы удалим из а один
знак
— скажем,
first
(а)—и используем его в качестве секущего
знака
х. Если обозначить теперь через
lcutl{a,x)
и
rcutl
(а, х)
такие (возможно, пустые) подслова слова а, образующие се-
чение,
что Icut
1
(а, х)-\- х +
rcutl
(а, х) представляет собой пере-
становку знаков слова а, то получится алгоритм, представлен-
ный
на рис. 128.
Пусть теперь нужно так переставить значения a[m],
а[т-\-
1], ..., а[п] заданного массива индексированных пере-
менных [s . Л] var
char
а (соотв. var a :
array
[s .. t] of char),
чтобы они стали упорядочены. Идея сортировки разделением
наводит на мысль создать сначала такое сечение, чтобы все пе-
ременные с индексами, не превосходящими некоторого опреде-
лённого индекса, содержали значения из левого множества сече-
ния,
а все последующие переменные массива — значения из
первого множества сечения. В качестве секущего возьмём знак
«[/], где f — произвольно выбранный индекс, лежащий в рас-
сматриваемом диапазоне индексов. Просмотр массива начи-
нается с i = т и / = п. Если для некоторого i выполнено нера-
венство a[t]^a[/]>
или
Д
ля
некоторого / — неравенство
&['}]
~^a[f],
то такой знак стоит уже „правильно", так что
можно увеличить i или соответственно уменьшить /. Если же
не
справедливо ни одно из этих неравенств, то a[j]
<Ca[i\.
После
обмена переменных a[j] и a[i] значениями оба знака
•будут
стоять „правильно", так что можно увеличить i и умень-
шить /. Во время выполнения описанного условного повторения