Скачиваний:
37
Добавлен:
29.03.2016
Размер:
1.27 Mб
Скачать

//проверка условия выхода

if (Done) and (Gap = 1) then break;

//вычисляем новый интервал Gap:=Gap*3 div 4;

if Gap=0 then Gap:=1

else if (Gap=9) or (Gap=10) then Gap:=11; end;{while}

//результат writeln('Sort array');

//выводим значения отсортированного массива for i:=Low(a) to High(a) do write(a[i], ' ');

readln;

end.

Обратите внимание, в программе из листинга 15 используется цикл с выходом из середины.

Сортировка методом выбора

Начиная с первого элемента массива осуществляется поиск минимального элемента массива и обмен его местами с первым элементом. Далее начиная со второго элемента осуществляется поиск минимального элемента массива и обмен его местами со вторым элементом. Процесс продолжается до тех пор, пока весь массив не будет отсортирован. Этот алгоритм дает такое же число сравнений O(n²), но число перестановок всего O(n). Приведенный алгоритм реализован в программе в листинге 16.

Листинг 16 – Сортировка методом выбора

{$IFDEF FPC}

{$MODE DELPHI} {$ENDIF}

{$APPTYPE CONSOLE} program SelectSort;

const n = 10;//длина массива

var a:array [0..n-1] of integer; i, j:integer;

buf:integer;

minIndex:Integer; begin

//инициализируем массив случайными числами Randomize;

for i:=Low(a) to High(a) do a[i]:=random(100);

//выводим значения не отсортированного массива writeln('Source array');

for i:=Low(a) to High(a) do write(a[i], ' '); writeln;

writeln;

//сортируем массив

for i:=Low(a) to High(a)-1 do begin minIndex:=i;

for j:=i+1 to High(a) do

if a[j]<a[minIndex] then minIndex:=j; if minIndex<>i then begin

buf:=a[i];

a[i]:=a[minIndex];

a[minIndex]:=buf;

end; end;{for i}

writeln('Sort array');

//выводим значения отсортированного массива for i:=Low(a) to High(a) do write(a[i], ' ');

readln;

end.

Сортировка вставками

На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном массиве, до тех пор, пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен. Временная сложность алгоритма при худшем варианте входных данных – O(n²).

Листинг 17 – Сортировка вставками

{$IFDEF FPC}

{$MODE DELPHI} {$ENDIF}

{$APPTYPE CONSOLE} program InsertionSort; const n = 10;

var a:array [0..n-1] of Integer; i,j,el:integer;

begin

//инициализируем массив случайными числами Randomize;

for i:=Low(a) to High(a) do a[i]:=random(100);

//выводим значения не отсортированного массива writeln('Source array');

for i:=Low(a) to High(a) do write(a[i], ' '); writeln;

writeln;

//сортировка

for i:=Low(a)+1 to High(a) do begin el:=a[i];

j:=i-1;

while (j>-1)and(a[j]>el) do begin a[j+1]:=a[j];

j:=j-1; end; a[j+1]:=el; end;

writeln('Sort array');

//выводим значения отсортированного массива for i:=Low(a) to High(a) do write(a[i], ' ');

readln;

end.

Сортировка Шелла

Сортировка Шелла – алгоритм сортировки, являющийся усовершенствованным вариантом сортировки вставками. Идея метода Шелла состоит в сравнении элементов, стоящих не только рядом, но и на определённом расстоянии друг от друга. Иными словами – это сортировка вставками с предварительными «грубыми» проходами. Аналогичный метод усовершенствования пузырьковой сортировки называется сортировка прочесыванием, рассмотренная выше.

При сортировке Шелла сначала сравниваются и сортируются между собой значения, отстоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений d, а завершается сортировка Шелла упорядочиванием элементов при d = 1 (то есть обычной сортировкой вставками).

Среднее время работы алгоритма зависит от длин промежутков – d, на которых будут находиться сортируемые элементы исходного массива ёмкостью N на каждом шаге алгоритма. Существует несколько подходов к выбору этих значений, например:

первоначально

используемая Шеллом последовательность длин промежутков:

 

d 1= N /2 ,

d i =d i1 /2 ,

d k=1 в худшем случае, сложность алгоритма составит

 

O(n²);

 

 

 

 

 

9 2i 9 2i/ 2+1, если нечетн

предложенная

Седжвиком

последовательность: d i ={8 2i 6 2(i+1)/2+1, если четн

При использовании таких приращений средняя сложность алгоритма составляет: O(n7/6), а в худшем случае порядка O(n4/3).

В программе, приведенной в листинге 18, используется предварительно вычисленные величины di по формуле Седжвика.

Листинг 18 – Сортировка Шелла

{$IFDEF FPC}

{$MODE DELPHI} {$ENDIF}

{$APPTYPE CONSOLE} program ShellSort; //таблица расстояний

const table_step:array [0..23] of integer = (1,5,19,41,109,209,505,929,2161,3905);

var a: array [0.. 9] of integer; isNoSwap: Boolean;

step: Integer; //текущий шаг i,j: Integer;

buf: Integer; table_step_index: integer;

begin

//инициализируем массив случайными числами Randomize;

for i:=Low(a) to High(a) do a[i]:=random(100);

//выводим значения не отсортированного массива writeln('Source array');

for i:=Low(a) to High(a) do write(a[i], ' '); writeln;

writeln;

Соседние файлы в папке ЛР по программированию FreePASCAL