Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы элементарных сортировок.doc
Скачиваний:
1
Добавлен:
10.07.2019
Размер:
124.93 Кб
Скачать

6.4. Пузырьковая сортировка

Метод сортировки, который многие обычно осваивают раньше других из-за его исключительной простоты, называется пузырьковой сортировкой (bubble sort), в рамках которой выполняются следующие действия: проход по файлу с обменом местами соседних элементов, нарушающих заданный порядок, до тех пор, пока файл не будет окончательно отсортирован. Основное достоинство пузырьковой сортировки заключается в том, что его легко реализовать в виде программы, однако вопрос о том, какой из методов сортировки реализуется легче других – пузырьковый, метод вставок или метод выбора – остается открытым. В общем случае пузырьковый метод обладает несколько меньшим быстродействием, однако его все же стоит рассмотреть для полноты картины.

Предположим, что мы всегда передвигаемся по файлу справа налево. Если удается обнаружить минимальный элемент на первом проходе, он меняется местами с каждым элементом, стоящим от него слева, и, в конце концов, этот элемент поменяется в позицию на левой границе массива. Затем на втором проходе в соответствующую позицию устанавливается второй по величине элемент и т.д. Таким образом, вполне достаточно выполнить N проходов, т.е., пузырьковую сортировку можно рассматривать как один из видов сортировки выбором, хотя при этом для помещения каждого элемента в соответствующую позицию приходится выполнять больший объем действий. Программа 6.4 представляет собой реализацию алгоритма пузырьковой сортировки, а на рис. 6.4 показан пример работы этого алгоритма.

A

S

O

R

T

I

N

G

E

X

A

M

P

L

E

РИСУНОК 6.4. ПРИМЕР ВЫПОЛНЕНИЯ ПУЗЫРЬКОВОЙ СОРТИРОВКИ

В процессе пузырьковой сортировки ключи с малыми значениями устремляются влево. Поскольку сортировка производится в направлении справа налево, каждый ключ меняется местами с ключом слева до тех пор, пока не будет обнаружен ключ с меньшим значением. На первом проходе E меняется местами с L, Р с М, пока не остановится справа от А; далее уже А продвигается к началу файла, пока не остановится перед другим А, который уже занимает окончательную позицию, i-й по величине ключ устанавливается в свое окончательное положение после i-ого прохода, как и в случае сортировки выбором, но при этом и другие ключи также приближаются к своим окончательным позициям

A

A

S

O

R

T

I

N

G

E

X

E

M

P

L

A

A

E

S

O

R

T

I

N

G

E

X

L

M

P

A

A

E

E

S

O

R

T

I

N

G

L

X

M

P

A

A

E

E

G

S

O

R

T

I

N

L

M

X

P

A

A

E

E

S

I

S

O

R

T

L

N

M

P

X

A

A

E

E

G

I

L

S

O

R

T

M

N

P

X

A

A

E

E

G

I

L

M

S

O

R

T

N

P

X

A

A

E

E

G

I

L

M

N

S

O

R

T

P

X

A

A

E

E

G

I

L

M

N

O

S

P

R

T

X

A

A

E

E

G

I

L

M

N

O

P

S

R

T

X

A

A

E

E

G

I

L

M

N

O

P

R

S

T

X

A

A

E

E

G

I

L

M

N

O

P

R

S

T

X

A

A

E

E

G

I

L

M

N

O

P

R

S

T

X

A

A

E

E

G

I

L

M

N

O

P

R

S

T

X

A

A

E

E

G

I

L

M

N

O

P

R

S

T

X

Программа 6.4. Пузырьковая сортировка

Для каждого i от m до г-1 внутренний цикл (j) помещает минимальный элемент среди элементов последовательности a[i],..., a[r] в а[1], переходя от элемента к элементу справа налево и выполняя при этом операции сравнения значений соседних элементов и обмена местами следующих друг за другом элементов. Наименьший элемент беспрепятственно перемещается при всех таких операциях сравнения влево и "всплывает как и пузырек" в начале файла. Как и в случае сортировки методом выбора, в условиях которой индекс i перемещается по файлу слева направо, элементы слева от него находятся в своих окончательных позициях.

template <class Item>

void bubble (Item a[], int m, int r)

{ for (int i=m; i<r; i++)

for (int j=r; j>i; j--)

compexch(a[j-l], a[j]);

}

Быстродействие программы 6.4 можно повысить за счет экономной реализации внутреннего цикла, выполняя те же приемы, которые применялись в разделе 6.3 при разработке программы сортировки вставками (см. также упражнение 6.25). В самом деле, если сравнивать программные коды, то программа 6.4 оказывается практически идентичной неадаптивной сортировке вставками, реализованной в программе 6.1. Различия между ними состоят в том, что в условиях сортировки вставками внутренний цикл for продвигается вдоль левой (отсортированной) части массива, а в условиях пузырьковой сортировки – вдоль правой (не обязательно отсортированной) части массива.

Программа 6.4 использует только инструкции compexch и по этой причине не является адаптивной реализацией, однако, если файл практически отсортирован, можно заставить ее работать с большей эффективностью, проверяя, не оказался ли очередной проход таким, что на нем не было выполнено ни одной операции перестановки элементов местами (что равносильно полному упорядочению файла, в связи с чем можно покинуть внешний цикл). Внедрение в программу подобного усовершенствования позволяет повысить быстродействие пузырьковой сортировки на некоторых типах файлов, однако в общем случае она не достигнет той эффективности, которая характерна для программы сортировки вставками, в которую внесены изменения, обеспечивающие своевременный выход из внутреннего цикла, о чем подробно рассказывается в разделе 6.5.