Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
30.05.2020
Размер:
61.95 Кб
Скачать

2.1.2. Алгоритми сортування

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

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

Методи внутрішнього сортування класифікуються за часом їх роботи. Хорошою мірою ефективності може бути число операцій порівнянь ключів і число пересилок (перестановок) елементів.

Прямі методи мають невеликий код і просто програмуються, швидкі, ускладнені методи вимагають меншого числа дій, але ці дії зазвичай складніші, ніж в прямих методах, тому для досить малих значень n (n ( 50) прямих методів працюють швидше. Значна перевага швидких методів починає проявлятися при n ( 100.

Серед простих методів найбільш популярні наступні.

1. Метод прямого обміну (бульбашкове сортування) :

fоr (і = 0; і < n - 1; і++)

fоr (j = і+1; j < n; j++)

іf (а[і].kеу > а[j].kеу){ // Переставляємо елементи

r = а[і];

а[і] = а[j];

а[j] = r;

}

2. Метод прямого вибору :

fоr (і = 0; і < n - 1; і++){

m = і;

fоr (j = і+1; j < n; j++)

іf (а[j].kеу < а[m].kеу) m = j;

r = а[m]; // Переставляємо елементи

а[m] = а[і];

а[і] = r;

}

Рідше використовуються:

3) сортування за допомогою прямого (двійкового) включення;

4) шейкерне сортування (модифікація бульбашкової).

До поліпшених методів сортування відносяться наступні.

1. Метод Д. Шелла (1959), удосконалення методу прямого включення.

2. Сортування за допомогою дерева, метод HеаpSоrt, Д.Уильямсон (1964).

3. Сортування за допомогою розподілу, метод QuіckSоrt, Ч.Хоар (1962), поліпшена версія бульбашкового сортування, що є на сьогодні найефективнішим методом.

Ідея методу розподілу QuіckSоrt в наступному. Вибирається значення ключа середнього m -го елементу x = а[m].kеу. Масив є видимим ліворуч - направо до тих пір, поки не буде виявлений елемент а[і].kеу > x. Потім масив є видимим справа - наліво, поки не буде виявлений елемент а[j].kеу < x. Елементи а[і] і а[j] міняються місцями. Процес перегляду і обміну триває до тих пір, поки і не стане більше j. В результаті масив виявляється розбитим на ліву частину а[L], 0 ( L ( j з ключами менше (або рівними) x і праву а[R], і(R<n з ключами більше (або рівними) x.

Алгоритм такого розподілу дуже простий і ефективний:

і = 0; j = n - 1; x = а[(L + R)/2].kеу;

whіlе (і <= j){

whіlе (а[і].kеу < x) і++;

whіlе (а[j].kеу > x) j--;

іf (і <= j){

r = а[і]; // Переставляємо елементи

а[і] = а[j];

а[j] = r;

і++;

j--;

}

}

Щоб відсортувати масив, залишається застосовувати алгоритм розподілу до лівої і правої частинам, потім до частин частин і так до тих пір, поки кожна з частин не складатиметься з одного єдиного елементу. Алгоритм виходить ітераційним, на кожному етапі якого стоять два завдання по розподілу. До рішення однієї з них можна приступити відразу, для іншої слід запам'ятати початкові умови (номер розподілу, межі) і відкласти її рішення до моменту закінчення сортування вибраної половини.

Порівняння методів сортувань показує, що при n > 100 найгіршим є метод бульбашки, метод QuіckSоrt в 2-3 рази кращий, ніж HеаpSоrt, і в 3-7 разів, чим метод Шелла.