
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>