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

10. Швидкі алгоритми сортування і пошуку

У цьому параграфі ми завершимо вивчення алгоритмів сортування і пошуку в масивах, розглянувши так звані швидкі методи сортування.

10.1. Нижня оцінка часу задачі сортування масиву за числом порівнянь

Можна довести, що будь-який алгоритм сортування масиву, що використовує тільки порівняння і перестановки, у гіршому випадку потребує мінімум O(n log2 n) порівнянь. Таким чином, функція складності в гіршому випадку алгоритму сортування С(n) обмежена знизу величиною O(n log2 n).

Пам’ятаймо, що алгоритм сортування вставками має таку ж саму за порядком величини функцію С(n).

Питання про оцінку оптимальної кількості перестановок М(n) ми розглянемо нижче. Можна припустити, що кожній перестановці передує деяке порівняння. Тоді загальна кількість перестановок, що здійснюється алгоритмом, не перевищує С(n) і, отже, ефективні алгоритми сортування повинні мати складність O(n*log2n) як за порівняннями, так і за перестановками. Зараз ми розглянемо деякі такі алгоритми.

10.2. Швидкі алгоритми сортування: Сортування деревом

Алгоритм сортування деревом ТreeSort по суті є поліпшенням алгоритму сортування вибором. Процедура вибору найменшого елементу вдосконалена як процедура побудови так званого дерева сортування. Дерево сортування – це структура даних, у якій представлений процес пошуку найменшого елемента методом попарного порівняння елементів, що стоять поряд. Алгоритм сортує масив у два етапи.

І етап: побудова дерева сортування;

ІІ етап: просівання елементів по дереву сортування.

Розглянемо приклад:

Нехай масив А складається з 8 елементів (мал. 10.1, 1-ий рядок). Другий рядок складається з мінімумів елементів першого рядка, що стоять поряд. Кожний наступний рядок складається з мінімумів елементів попереднього, що стоять поряд.

a 2 = min(a1,a2)

a3 = min(a3,a4)

a5 = min(a5,a6)

a8 = min(a7,a8)

a3 = min(a2,a3)

a5 = min(a5,a8)

a5 = min(a3,a5)

Рис 10.1. Дерево сортування масиву з 8-ми елементів.

Цю структуру даних називають деревом сортування. У корені дерева знаходиться найменший елемент. Крім цього, в дереві побудовані шляхи елементів масиву від листя до відповідного за величиною елемента вузла – розгалуження. (На рис. 10.1 шлях мінімального елемента а5 – від листа а5 до кореня відмічений товстою лінією.)

Коли дерево побудовано, починається етап просівання елементів масиву по дереву. Мінімальний елемент пересилається у вихідний масив В і всі входження цього елемента в дереві замінюються на спеціальний символ М.

Рис. 10.2. Просівання найменшого елементу

Потім здійснюється просівання елемента уздовж шляху, відміченого символом М, починаючи з листка, сусіднього з М (На рис. 10.2 зверху-вниз) і до кореня. Крок просівання – це вибір найменшого з двох елементів, що зустрілись на шляху до кореня дерева і його пересилання у вузол, відмічений М. Просівання 2-го елемента показано на мал. 10.3 (Символ М більше, ніж будь-який елемент масиву.)

a6 = min(M, a6)

a6 = min(a6, a8)

a3 = min(a3, a6)

b2 := a3

Рис.10.3. Просівання 2-го елемента

Просівання елементів відбувається до тих пір, поки весь вихідний масив не буде заповнений символами М, тобто n разів:

For I := 1 to n do begin

Відмітити шлях від кореня до листка символом М;

Просіяти елемент уздовж відміченого шляху;

B[I] := корінь дерева

end;

Обгрунтування правильності алгоритму очевидне, оскільки кожне чергове просівання викидає у масив В найменший з елементів масиву А, що залишився.

Дерево сортування можна реалізувати, використовуючи або двомірний масив, або одномірний масив ST[1..N], де N = 2n-1 (див. наступний розділ).