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

Метод "пузырька"

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

В течение первого просмотра (прохода) таблицы сравниваются ключи первой (R[1]) и второй (R[2]) записей, и, если порядок между ними нарушен, то записи R[1] и R[2] меняются местами. Затем этот процесс повторяется для записей R[2] и R[3], R[3] и R[4],..., R[n-1] и R[n], причем при выполнении сравнения записи с меньшими ключами будут "всплывать" (то есть перемещаться на позицию с меньшим индексом). В результате первого прохода запись с наибольшим значением ключа "осядет" в позиции n. При втором проходе таблицы сравниваются ключи записей R[1] и R[2], R[2] и R[3],...,R[n-2] и R[n-1]. Запись с наибольшим значением ключа "осядет" в позиции (n-1).

Для сортировки таблицы требуется максимально (n-1) проходов, причем при каждом проходе один "пузырек" располагается на уровне, соответствующем его весу. Рассмотренный алгоритм можно сделать эффективнее, если после каждого прохода выполнять проверку: были ли совершены перестановки в течение данного прохода. Если перестановок не было, то это означает, что таблица уже отсортирована, и процесс можно завершить. Кроме того, можно запоминать не только сам факт, что обмен имел место, но и положение (индекс) последнего обмена. Это позволит уменьшить на следующем шаге просматриваемую часть таблицы.

Характеристики сортировки методом "пузырька" в худшем случае составляют сравнений и перестановок (худшим считается случай, когда записи наиболее удалены от своих конечных позиций). Среднее число сравнений и перестановок пропорционально n2 /2.

Рассмотрим пример сортировки методом "пузырька" (процедура, реализующая метод "пузырька" на языке Паскаль, приведена на рисунке 1):

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

Проходы

1

2

3

4

5

15

15

8

8

3

1

23

8

15

3

1

3

8

16

3

1

8

8

16

3

1

15

15

15

3

1

16

16

16

16

1

20

20

20

20

20

20

23

23

23

23

23

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

Const Nmax=100;

Type

Rec=Record

kl : integer;

Inf : string [10];

End;

Table-=Array [1..Nmax] Of Rec;

. . . . . . . . . .

Procedure bubble (Var T:Table; n:integer);

{T – имя таблицы; n – размер таблицы (количество записей)}

{kl – ключ записи (поле сортировки)}

Var

i, k, m: integer;

pr: boolean;

zap: rec;

Begin

k:=n-1; pr:=true;

while (k>=1) and pr do

begin

pr:=false;

for i:=1 to k do

if T[i].kl > T[i+1].kl then

begin

zap:=T[i];

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

T[i+1]:=zap;

m:=i;

pr:=true;

end;

k:=m-1;

end

end;

Рисунок 1 – Процедура сортировки таблицы методом "пузырька"

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