4.1.1. Пусть
-- целые числа. Требуется
построить массив
, содержащий те же
числа, для которого
.
Решение.
k := 0; {k наименьших элементов массива установлены на свои места} while k <> n do begin | s := k + 1; t := k + 1; | {x[s] - наименьший среди x[k+1]...x[t] } | while t<>n do begin | | t := t + 1; | | if x[t] < x[s] then begin | | | s := t; | | end; | end; | {x[s] - наименьший среди x[k+1]..x[n] } | ... переставить x[s] и x[k+1]; | k := k + 1; end;`
4.1.2. Дать другое решение задачи сортировки, использующее
инвариант << первые k элементов упорядочены>> (
).
k:=1 {первые k элементов упорядочены} while k <> n do begin | t := k+1; | {k+1-ый элемент продвигается к началу, пока не займет | надлежащего места, t - его текущий номер} | while (t > 1) and (x[t] < x[t-1]) do begin | | ... поменять x[t-1] и x[t]; | | t := t - 1; | end; end;`
Замечание. Дефект программы: при ложном выражении (t>1) проверка
Оба предложенных решения требуют числа действий,
пропорционального . Существуют более эффективные
алгоритмы.