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

Розділ 15. Типові методи сортування масивів

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

До основних покращених алгоритмів сортування належать: сортування Шелла, та швидке сортування (quicksort). Найшвидшим алгоритмом є алгоритм швидкого сортування. Його доцільно використовувати для великих об’ємів даних. Якщо дані займають невеликі обсяги можна використовувати типові алгоритми сортування. Розглянемо кожен з алгоритмів більш детально.

15.1. Бульбашкове сортування (bubble sort)

Бульбашкове сортування (bubble sort, сортування методом бульбашки, або просто сортування бульбашкою). Метод бульбашкового сортування є самим простим та малоефективним.

Бульбашкове сортування відноситься до класу обмінних сортувань, тобто до класу сортувань методом обміну. Її алгоритм містить порівняння (тобто багатократні порівняння одних і тих же елементів), що повторюються, і, при необхідності, обмін сусідніх елементів. Елементи поводяться подібно до бульбашок повітря у воді - кожний з них піднімається на свій рівень. Проста форма алгоритму наступна:

void BulbSort(double* a, int l, int r)

{

int i,j;

double tmp;

for(i=l;i<r;i++)

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

if(a[j]<a[i])

{

tmp=a[i];

a[i]=a[j];

a[j]=tmp;

}

}

Тут a – вказівка на масив типу double, що підлягає сортуванню, l – нижній індекс, r – верхній індекс масиву. Робота бульбашкового сортування виконується в двох циклах. Зовнішній цикл переглядається до передостаннього елементу масиву (i<r). Це забезпечує розміщення елементів в правильному порядку до кінця виконання функції навіть в найгіршому випадку. Всі порівняння і обміни виконуються у внутрішньому циклі. (Злегка покращувана версія алгоритму бульбашкового сортування завершує роботу, якщо при прогляданні масиву не було зроблено жодного обміну, але це досягається за рахунок додавання ще одного порівняння при кожному проході внутрішнього циклу.)

При аналізі будь-якого алгоритму сортування корисно знати, скільки операцій порівняння і обміну буде виконано в кращому, середньому і гіршому випадках. Оскільки характеристики виконуваного коду залежать від таких чинників, як оптимізація, вироблювана компілятором, відмінності між процесорами і особливості реалізації, ми не намагатимемося набути точного значення цих параметрів. Натомість сконцентруємо свою увагу на загальній ефективності кожного алгоритму.

У бульбашковому сортуванні кількість порівнянь завжди одна й та ж, оскільки два цикли for повторюються вказану кількість разів незалежно від того, був список спочатку впорядкований чи ні. Це означає, що алгоритм бульбашкового сортування завжди виконує (n2 - n)/2 порівнянь, де п - кількість сортованих елементів. Дана формула виведена на тій підставі, що зовнішній цикл виконується п - 1 раз, а внутрішній виконується в середньому п/2 раз. Добуток цих величин і дає попередній вираз. Зверніть увагу на член п2 у формулі. Бульбашкове сортування є алгоритмом порядку п2, оскільки час його виконання пропорційний квадрату кількості сортованих елементів. Необхідно визнати, що алгоритм порядку п2 не ефективний при великій кількості елементів, оскільки час виконання росте експоненціально залежно від кількості сортованих елементів.

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