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

Void s(int *a, int n)

{

int i, inc, j, tmp;

for(inc = n; inc >0;)

{

for(i = inc; i<n; i++)

{

j = i; tmp = a[i];

while(j >= inc && (tmp < a[j-inc]))

{

a[j] = a[j-inc]; j -= inc;

cykl++;

}

a[j] = tmp; kil++;

}

inc = ((inc>1) && (inc<5)) ? 1 : 5*inc/11;

}

}

main()

{

int i, count = 999;

int m[999], dop[9] = {9, 3, 5, 1, 6, 7, 4, 2, 3};

clrscr();

for(i = 0; i<count; i++)m[i] = 0;

for(i = 0; i<9; i++)m[i] = dop[i]; /* cykl = 47 kil = 7166 */

/* for(i = 0; i<9; i++)m[i+990] = dop[i]; cykl = 9 kil = 7166 */

for(i = 0; i<count; i++)printf("%2d", m[i]);

s(m, count); getch( );

printf("\ncykl=%d kil=%d\n", cykl, kil); getch( );

for(i = 0; i<count; i++)printf("%2d", m[i]);

getch();

}

Використання цього методу сортування оправдане наявністю декількох великих елементів у масиві даних. Іноді найбільший елемент може стояти на першому місці. У такому випадку сортування методом вставок на кожному кроці буде переміщувати цей елемент на одну позицію правіше (нижче). Максимальний елемент буде переміщуватися n-1 разів. Іноді поруч з ним знаходяться інші великі елементи. Вони так же, як і максимальний елемент, будуть переміщуватися в кінець масиву. У деяких порівняно рідкісних випадках всі елементи масиву розташовуються в зворотному порядку, тоді метод вставок стає найнеефективнішим. Саме в цьому випадку переважає сортування методом Шелла. Значні переваги перед методом вставок він має при сортуванні майже впорядкованого масиву. Вважається, що час сортування за методом Шелла пропорціональний .

Реалізацію методу Шелла мовою С показано в прикладі 12.4. У цій програмі inc = h – крок, який після кожного сортування сегментів зменшується в 5/11 разів, поки не досягне значення 1.

Хоча принцип сортування методом Шелла досить простий, аналіз його ефективності затрудненений, бо довжина сегментів не регламентована. Відомо, однак, що при вдалому виборі послідовності довжин кроків h його 0-нотація менша за n.

Метод Хоара показано в прикладі 12.5, де він реалізований за допомогою рекурсії функцій. В даному випадку функція s() має три параметри: a – заданий масив, left – ліва та right – права межа діапазону сортування, який з кожним зверненням до цієї функції зменшується.

Сортування починається з елемента, який знаходиться посередині діапазону (між left і right), його ще називають компарандом. Найкращим варіантом початкового елемента буде середньоарифметичне значення, тобто середнє між максимальним і мінімальним, які будуть крайніми в посортованому масиві і які, як правило, заздалегідь невідомі.

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

Відомо, що рекурсія функцій – циклічний процес, тому під час випробування програми варто підрахувати не лише число, так би мовити, чистих циклів, але й кількість звернень до процедури. Для цього тут застосовуються змінні: cykl2 – загальна кількість виконань циклів та cykl1 – кількість звернень до процедури.

Приклад 12.5 – Сортування методом Хоара

# include<stdio.h> /* Метод Хоара */

int cykl1 = 0, cykl2 = 0, kil = 0;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]