Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sd_lab_1.doc
Скачиваний:
23
Добавлен:
17.11.2018
Размер:
3.44 Mб
Скачать

Шейкер – сортировка

Метод "пузырька" можно улучшить, если менять направления следующих один за другим проходов таблицы. Этот вариант метода назван шейкер – сортировкой. Его выгодно использовать в тех случаях, когда "легкие" пузырьки расположены в исходной таблице на противоположном ("тяжелом") конце.

Рассмотрим работу этого метода на том же примере, что и в методе "пузырька":

Начальные ключи

Проходы

1

2

3

4

15

15

1

1

1

23

8

15

8

3

8

16

8

15

8

16

3

16

3

15

3

1

3

16

16

1

20

20

20

20

20

23

23

23

23

Шейкер – сортировка выполняется быстрее, чем сортировка "пузырьком" (число сравнений равно, примерно, (n*n)/4+n ).

Метод вставки с прямым включением

Метод вставки с прямым включением основывается на следующем утверждении: перед рассмотрением записи R[i] (i=2, 3, …, n) предыдущие записи R[1], R[2], ..., R[i-1] уже упорядочены (K[1]<=K[2]<=...<=K[i-1]), и для R[i] среди них должно быть найдено соответствующее место.

Рассмотрим i‑й шаг сортировки. Если K[i]<K[i-1], то запись R[i] запоминается в рабочей переменной (например, RAB), и ее ключ сравнивается поочередно с ключами записей R[j] (j=i-1, i-2, ..., 1) до тех пор, пока выполняется условие K[i]<K[j] или достигнут левый конец упорядоченной подтаблицы (j=0). Выполнение условия K[i]>=K[j] означает, что запись RAB нужно вставить между R[j] и R[j+1]. Чтобы подготовить место для вставки (позиция (j+1)), операции сравнения нужно чередовать с операциями перемещения записей на одну позицию (R[j+1]=R[j]). Завершается i-й шаг операцией R[j+1]=RAB.

Ниже показано выполнение i-го шага вставки. Ключевое значение записи R[i], равное 6, сравнивается с предыдущими ключами, и при необходимости записи перемещаются:

Процедура сортировки таблицы методом вставки с прямым включением имеет вид:

{описание типов}

Const Nmax=100;

Type rec=record

kl: integer;

inf: string[10]

end;

Table=Array[1..Nmax] of rec;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

procedure VST (var T:Table; n:integer);

{Т- имя таблицы, n – размер таблицы, сортировка по полю kl}

var

i, j: integer;

rab: rec;

begin

for i:=2 to n do

if T[i].kl<T[i-1].kl then

begin

rab:=T[i];

j:=i-1;

while (j>0) and (rab.kl<T[j].kl) do

begin

T[j+1]:=T[j];

j:=j-1

end;

T[j+1]:= rab;

еnd;

end;

Количество операций сравнения для метода вставки определяется по формуле C = n (n – 1)/4. При достаточно большом n можно принять C = n2/4. Максимальное количество перестановок при использовании этого метода равно, примерно, n2/4.

Метод вставки обычно используется тогда, когда нужно внести записи в упорядоченную таблицу. Новая запись должна быть вставлена в таблицу таким образом, чтобы существующая упорядоченность не нарушилась.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]