Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
116
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

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

Основной принцип пузырьковой сортировки состоит в выталкивании маленьких значений на вершину списка, в то время как большие значения опускаются вниз. У пузырьковой сортировки есть много различных вариантов.

Алгоритм пузырьковой сортировки совершает несколько проходов по списку. При каждом проходе происходит сравнение соседних элементов. Если порядок соседних элементов неправильный (инверсия), то они меняются местами. Каждый проход начинается с начала списка. Сначала сравниваются первый и второй элементы, затем 2 и 3, потом 3 и 4 и т.д. Элементы с неправильным порядком в паре переставляются.

При обнаружении на первом проходе максимального элемента, он будет переставляться со всеми последующими элементами, пока не дойдет до конца списка. Поэтому при втором проходе нет необходимости производить сравнение с последним элементом. При втором проходе второй по величине элемент переместится во вторую позицию с конца.

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

При каждом проходе к своему месту продвигаются сразу несколько элементов, хотя гарантировано занимает свое положение лишь один.

BubbleSort (A, N)

// A - сортируемый список

// N - число элементов

К  N

swap_el  true

while swap_el do

К  К - 1

swap_el  false

For i=1 to К do

if a[i] > a[i+1] then

Swap a[i], a[i+1]

swap_el  true

endif

endfor

endwhile

end

Проведем анализ наихудшего случая: список идет в обратном порядке – на последнем месте минимальный элемент. На первом проходе будет (N - 1) операций сравнений и перестановки, на втором проходе (N-2) – сравнений и перестановок, что в сумме дает:

fА(N) = =

Асимптотическая оценка fА(N) = O (N2/2)

Пример 3.2 Пузырьковая сортировка

7 3 9 4 2 5 6 1 8 -- исходный список

1 проход – 8 сравнений, 7 перестановок

(7 3) 9 4 2 5 6 1 8

3 (7 9) 4 2 5 6 1 8

3 7 (9 4) 2 5 6 1 8

3 7 4 (9 2) 5 6 1 8

3 7 4 2 (9 5) 6 1 8

3 7 4 2 5 (9 6) 1 8

3 7 4 2 5 6 (9 1) 8

3 7 4 2 5 6 1 (9 8)

3 7 4 2 5 6 1 8 9

2 проход: 7 сравнений, 5 перестановок

(3 7) 4 2 5 6 1 8 9

3 (7 4) 2 5 6 1 8 9

3 4 (7 2) 5 6 1 8 9

3 4 2 (7 5) 6 1 8 9

3 4 2 5 (7 6) 1 8 9

3 4 2 5 6 (7 1) 8 9

3 4 2 5 6 1 (7 8) 9

3 проход: 6 сравнений, 2 перестановки

(3 4) 2 5 6 1 7 8 9

3 (4 2) 5 6 1 7 8 9

3 2 (4 5) 6 1 7 8 9

3 2 4 (5 6) 1 7 8 9

3 2 4 5 (6 1) 7 8 9

3 2 4 5 1 (6 7) 8 9

и т.д.

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