
- •Введение
- •Структурные типы данных
- •Множества
- •Массивы
- •Ввод-вывод массивов
- •Вставка и удаление элемента в массив
- •Поиск
- •Последовательный поиск.
- •Бинарный поиск
- •Интерполирующий поиск
- •Вставка элемента в отсортированный контейнер
- •Поиск максимального и минимального элементов массива
- •Сортировка
- •Пузырьковая сортировка
- •Сортировка перемешиванием
- •Сортировка методом прочесывания
- •Сортировка методом выбора
- •Сортировка вставками
- •Сортировка Шелла
- •Строки
- •Задания к лабораторной работе
- •Варианты заданий
- •Вопросы к лабораторной работе

//проверка условия выхода
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 i−1 /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;