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

Void s(int *a, int n)

{

int i, j, tmp, ind;

for(i = 0; i<n-1; i++)

{ind = 0;

for(j = 1; j<n; j++)

{

if(a[j]<a[j-1]){tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; ind++; kil++;}

cykl++;

}

if(ind == 0)break;

}

return;

}

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 = 9980 kil = 8932 */

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

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

s(m, count); getch();

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

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

getch( );

}

Метод лінійних вставок до певної міри можна вважати комбінацією двох попередньо розглянених. У процесі виконання програми подібно до методу вибору масив ділиться на дві частини: вже посортовану і ще ні. Межею між ними є значення параметра зовнішнього циклу. Якщо черговий елемент, вибраний у зовнішньому циклі, виявиться меншим, ніж найбільший у вже посортованій частині масиву, то він у внутрішньому циклі пересувається на своє місце бульбашковим методом. Цей метод демонструє програма, подана в прикладі 12.3.

Приклад 12.3 – Метод лінійних вставок

# include<stdio.h> /* Метод лінійних вставок */

int cykl = 0, kil = 0;

Void s(int *a, int n)

{

int i, j, tmp;

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

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

{

cykl++;

if(a[j-1] > a[j]){kil++; tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp;}

else break;

}

return;

}

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 = 9927 kil = 8932 */

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

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

getch( );

s(m, count);

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

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

getch( );

}

Метод Шелла вважається оптимальним з погляду на складність, особливо для порівняно невеликих наборів даних (до 20 елементів).

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

Нехай масив складається з h окремих сегментів, тоді кожний з них міститиме приблизно n, поділене на h, елементів. Після того, як усі сегменти відсортовані, масив поділяється на меншу кількість сегментів (тобто довжина кроку зменшується). Процес повторюється до остаточного сортування всього масиву, коли h стане дорівнювати 1. Оскільки довжина останнього кроку досягає 1, то можна використовувати будь-яку послідовність довжин кроків. Тим не менше, деякі значення довжини кроків мають переваги над іншими.

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

# include<stdio.h> /* Метод Шелла */

int cykl = 0, kil = 0;

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