Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

16.Сортировка бинарными вставками

Сортировку простыми вставками можно модифицировать, если при поиске «подходящего места» для вставляемого элемента использовать метод двоичного поиска. Среди отсортированной части массива выберем серединный элемент и сравним его с ключом. Если ключ меньше этого элемента, то поиск места вставки следует продолжать в левой половине упорядоченной части массива, иначе – в правой половине. Эта схема получила название сортировки бинарными вставками.

Этот алгоритм представляет из себя оптимизированную версию метода вставки, отличие заключается в том, что при поиске место, на которое надо вставить элемент aiв уже упорядоченную совокупность a0 , ..., ai-1 , определяется алгоритмом деления пополам.

Алгоритм метода имеет следующий вид:

procedure BinaryInsertionSort(var Arr : array of Real; N : Integer);

var

B,C,E,I,J,K : Integer;

Tmp : Real;

begin

i:=2;

repeat

b:=1;

e:=i-1;

c:=((b+e) div 2);

while b<>c do

begin

if Arr[c-1]>Arr[i-1] then e:=c

else b:=c;

c:=((b+e) div 2);

end;

if Arr[b-1]<Arr[i-1] then

begin

if Arr[i-1]>Arr[e-1]

then b:=e+1

else b:=e;

end;

k:=i;

Tmp:=Arr[i-1];

while k>b do

begin

Arr[k-1]:=Arr[k-1-1];

dec(k)

end;

Arr[b-1]:=Tmp;

inc(i);

until not(i<=n);

end;

17. Методы внутренней сортировки: Сортировка «Шелла»

Сортировка Шелла получила свое название по имени ее создателя Д.Л.Шелла. Однако, это название можно считать удачным, так как выполняемые при сортировке действия напоминают укладывание морских ракушек друг на друга. ("Ракушка" - одно из значений слова shell - Примеч. пер.)

Общий метод, который использует сортировку вставкой, применяет принцип уменьшения расстояния между сравниваемыми элементами. Сначала сортируются все элементы, которые смещены друг от друга на три позиции. Затем сортируются все элементы, которые смещены на две позиции. И, наконец, упорядочиваются все соседние элементы.

{ сортировка Шелла }

procedure Shell(var item: DataArray; count:integer);

const

t = 5;

var

i, j, k, s, m: integer;

h: array[1..t] of integer;

x: DataItem;

begin

h[1]:=9; h[2]:=5; h[3]:=3; h[4]:=2; h[5]:=1;

for m := 1 to t do

begin

k:=h[m];

s:=-k;

for i := k+1 to count do

begin

x := item[i];

j := i-k;

if s=0 then

begin

s := -k;

s := s+1;

item[s] := x;

end;

while (x<item[j]) and (j<count) do

begin

item[j+k] := item[j];

j := j-k;

end;

item[j+k] := x;

end;

end;

end; { конец сортировки Шелла }