Суть цього алгоритму полягає в тому, що елемент, що сортується ніби "спливає", подібно бульбашки (до речі, саме тому алгоритм отримав свою назву), і рухається він до тих пір, поки не знайдений своє місце. У реалізації цього алгоритм дуже простий, дивіться самі:
Якщо ви уважно подивитеся на програму, то напевно відразу задасте питання, чому перший цикл починається з другого елементу? Що б відповісти на нього, подивимося вкладений цикл. Він починається з кінця переліку, що сортується і йде в зворотному напрямку до поточного елемента батьківського циклу. Тепер звернемо увагу на вміст вкладеного циклу:
Як бачимо, ми здійснюємо операції з елементом під номером j-1. На першому проході це і буде елемент під номером 1 (тому що 2-1 = 1).
Як же працює алгоритм бульбашкового сортування? Верхній цикл переміщує вказати в прямому напрямку, за покажчиком елементи виявляються відсортованими. А безпосередньо сортуванням займається вкладений цикл. Він то і як раз "проштовхує" елемент до свого місця, роблячи це шляхом перестановок.
x: = item [j-1];
item [j-1]: = item [j];
item [j]: = x;
Природно, перестановка потрібна тільки в тому випадку, коли попередній елемент більше поточного - значить, його потрібно "опустити", а поточний навпаки, "підняти". Якщо ми сортуємо за спаданням, тоді, природно, все навпаки.
А тепер ми займемося тестуванням алгоритму. Розмістимо на формі компоненти згідно скриншоту *:
Поле списку (TListBox). яке відобразить масив до сортування, назвемо lbIn, який після - lbOut, галочка показати результати (chbShowResults) потрібна нам для того, що б ми могли відключити виведення списку на екран, коли буем тестувати великі списки з метою з'ясувати швидкодію алгоритму. Поле для введення кількості елементів масиву (TSpinEdit) назвемо seCount. мітки для виведення часу початку і закінчення сортування lbBegSort і lbEndSort відповідно, кнопочку btnSort.
Тепер почнемо програмувати. Вставимо текст процедури Bubble в розділ implementation. В розділ типів додамо нові типи:
DataItem = integer;
DataArray = array [1..800000] of integer;
Оголосимо глобальну змінну Ar: DataArray *;
У об'єкта seCount встановимо властивість зMinValue 1, а MaxValue 800000.