
- •1 Основні поняття
- •2 Засоби мови с
- •3 Структура програми, директиви препроцесору
- •4 Елементарні алгоритми
- •5 Бітові операції
- •6 Вкладені алгоритми
- •7 Складні типи даних
- •9 Процедури
- •Int main(void)
- •Void systema(float *yy)
- •Int main(void)
- •Void rekurs(float a, float s, int I)
- •Int main(void)
- •Void reku_for(float z, int I)
- •Int main(void)
- •10 Файли
- •11 Динамічні конструкції даних
- •Int main(void)
- •Int main(void)
- •Int main(void)
- •12 Сортування
- •Void s(int *a, int n)
- •Int main(void)
- •Void s(int *a, int n)
- •Void s(int *a, int n)
- •Void s(int *a, int n)
- •Void s(int *a, int left, int right)
- •Void s(struct pidpr *a, int n)
- •Int main(void)
- •13 Пошук
- •Int p(struct pidpr *a, char *slo, int n)
- •Int p(struct pidpr *a, char *slo, int n)
- •Void s(struct pidpr *a, int n)
- •Int p(char *slo, int n)
- •Int main(void)
- •14 Класи
- •Int main()
- •Void based :: fun()
- •Void poxid :: fun()
- •Int main()
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;