logo

Алгоритм сортування оболонки

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

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

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

Цей алгоритм спочатку сортує елементи, які знаходяться далеко один від одного, а потім зменшує розрив між ними. Цей розрив називається як інтервал. Цей інтервал можна розрахувати за допомогою Кнута формула, наведена нижче -

бульбашковий сорт
 h = h * 3 + 1 where, 'h' is the interval having initial value 1. 

Тепер розглянемо алгоритм сортування оболонки.

Алгоритм

Нижче наведено прості кроки досягнення сортування оболонки:

набір машинописів
 ShellSort(a, n) // &apos;a&apos; is the given array, &apos;n&apos; is the size of array for (interval = n/2; interval &gt; 0; interval /= 2) for ( i = interval; i <n; i +="1)" temp="a[i];" for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; a[j] = temp; End ShellSort </n;>

Робота алгоритму сортування Shell

Тепер давайте подивимося, як працює алгоритм сортування оболонки.

Щоб зрозуміти роботу алгоритму сортування оболонки, візьмемо несортований масив. Зрозуміти сортування оболонки буде легше на прикладі.

Нехай елементи масиву -

Алгоритм сортування оболонки

Ми будемо використовувати оригінальну послідовність сортування оболонки, тобто N/2, N/4,....,1 як інтервали.

У першому циклі n дорівнює 8 (розмір масиву), тому елементи лежать на інтервалі 4 (n/2 = 4). Елементи порівнюються та міняються місцями, якщо вони не в порядку.

Тут, у першому циклі, елемент на 0тиспозиція порівнюватиметься з елементом 4тисположення. Якщо 0тисбільший елемент, його буде замінено на елемент 4тисположення. В іншому випадку вона залишається незмінною. Цей процес триватиме для решти елементів.

З інтервалом 4 підсписки: {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Алгоритм сортування оболонки

Тепер ми маємо порівняти значення в кожному підсписку. Після порівняння ми повинні поміняти їх місцями, якщо потрібно, у вихідному масиві. Після порівняння та заміни оновлений масив матиме такий вигляд:

Алгоритм сортування оболонки

У другому циклі елементи лежать на інтервалі 2 (n/4 = 2), де n = 8.

перетворити рядок на ціле число

Тепер ми беремо інтервал 2 щоб відсортувати решту масиву. З інтервалом 2 буде згенеровано два підсписки - {12, 25, 33, 40} і {17, 8, 31, 42}.

Алгоритм сортування оболонки

Тепер нам знову потрібно порівняти значення в кожному підсписку. Після порівняння ми повинні поміняти їх місцями, якщо потрібно, у вихідному масиві. Після порівняння та заміни оновлений масив матиме такий вигляд:

як перевірити розмір екрана
Алгоритм сортування оболонки

У третьому циклі елементи лежать на інтервалі 1 (n/8 = 1), де n = 8. Нарешті, ми використовуємо інтервал значення 1 для сортування решти елементів масиву. На цьому кроці сортування оболонки використовує сортування вставкою для сортування елементів масиву.

Алгоритм сортування оболонки

Тепер масив відсортовано в порядку зростання.

Складність сортування оболонки

Тепер давайте подивимося на часову складність сортування Shell у найкращому, середньому та гіршому випадку. Ми також побачимо просторову складність сортування Shell.

1. Складність часу

Справа Складність часу
Кращий випадок O(n*logn)
Середній випадок O(n*log(n)2)
Найгірший випадок O(n2)
    Найкращий варіант складності -Це відбувається, коли сортування не потрібно, тобто масив уже відсортовано. Оптимальна часова складність сортування Shell O(n*logn). Середня складність справи -Це відбувається, коли елементи масиву розташовані в перемішаному порядку, який неправильно зростає та спадає. Середня складність випадку сортування Shell становить O(n*logn). Найгірша складність -Це відбувається, коли елементи масиву потрібно відсортувати у зворотному порядку. Це означає, що ви повинні відсортувати елементи масиву в порядку зростання, але його елементи розташовані в порядку спадання. Найгірша часова складність сортування Shell O(n2).

2. Просторова складність

Космічна складність O(1)
Стабільний НІ
  • Просторова складність сортування Shell дорівнює O(1).

Реалізація сортування Shell

Тепер давайте розглянемо програми сортування Shell на різних мовах програмування.

програма: Напишіть програму для реалізації сортування Shell мовою C.

 #include /* function to implement shellSort */ int shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; // put temp (the original a[i]) in its correct position a[j] = temp; } } return 0; } void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 42 i++) printf('%d ', a[i]); } int main() { a[]="{" 33, 31, 40, 8, 12, 17, 25, }; n="sizeof(a)" sizeof(a[0]); printf('before sorting array elements are - 
'); printarr(a, n); shell(a, printf('
after applying shell sort, the return 0; < pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-7.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in C++.</p> <pre> #include using namespace std; /* function to implement shellSort */ int shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; // put temp (the original a[i]) in its correct position a[j] = temp; } } return 0; } void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 41 i++) cout< <a[i]<<' '; } int main() { a[]="{" 32, 30, 39, 7, 11, 16, 24, }; n="sizeof(a)" sizeof(a[0]); cout<<'before sorting array elements are - 
'; printarr(a, n); shell(a, cout<<'
after applying shell sort, the return 0; < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-8.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in C#.</p> <pre> using System; class ShellSort { /* function to implement shellSort */ static void shell(int[] a, int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; /* put temp (the original a[i]) in its correct position */ a[j] = temp; } } } static void printArr(int[] a, int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 40 i++) console.write(a[i] + ' '); } static void main() { int[] a="{" 31, 29, 38, 6, 10, 15, 23, }; int n="a.Length;" console.write('before sorting array elements are - 
'); printarr(a, n); shell(a, console.write('
after applying shell sort, the < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-9.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in Java.</p> <pre> class ShellSort { /* function to implement shellSort */ static void shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; /* put temp (the original a[i]) in its correct position */ a[j] = temp; } } } static void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 39 i++) system.out.print(a[i] + ' '); } public static void main(string args[]) { int a[]="{" 30, 28, 37, 5, 9, 14, 22, }; n="a.length;" system.out.print('before sorting array elements are - 
'); printarr(a, n); shell(a, system.out.print('
after applying shell sort, the < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-10.webp" alt="Shell Sort Algorithm"> <p>So, that&apos;s all about the article. Hope the article will be helpful and informative to you.</p> <hr></n;></n;></pre></n;></n;></pre></n;></n;></pre></n;></n;>