logo

Algorytm sortowania powłoki

W tym artykule omówimy algorytm sortowania powłoki. Sortowanie powłokowe to uogólnienie sortowania przez wstawianie, które przezwycięża wady sortowania przez wstawianie, porównując elementy oddzielone odstępem kilku pozycji.

Jest to algorytm sortowania będący rozszerzoną wersją sortowania przez wstawianie. Sortowanie powłokowe poprawiło średni czas złożoności sortowania przez wstawianie. Podobnie jak sortowanie przez wstawianie, jest to algorytm sortowania lokalnego i oparty na porównaniu. Sortowanie powłokowe jest efektywne w przypadku zbiorów danych średniej wielkości.

Podczas sortowania przez wstawianie elementy można przesuwać w przód tylko o jedną pozycję. Aby przesunąć element w odległą pozycję, wymaganych jest wiele ruchów, które wydłużają czas wykonania algorytmu. Ale sortowanie powłokowe eliminuje tę wadę sortowania przez wstawianie. Umożliwia także przemieszczanie i zamianę odległych elementów.

Algorytm ten najpierw sortuje elementy oddalone od siebie, a następnie zmniejsza odstęp między nimi. Ta luka nazywa się interwał. Przedział ten można obliczyć za pomocą Knutha wzór podany poniżej -

 h = h * 3 + 1 where, 'h' is the interval having initial value 1. 

Przyjrzyjmy się teraz algorytmowi sortowania przez powłokę.

Algorytm

Proste kroki prowadzące do sortowania powłoki są następujące:

lista
 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;>

Działanie algorytmu sortowania powłoki

Przyjrzyjmy się teraz działaniu algorytmu sortowania przez powłokę.

Aby zrozumieć działanie algorytmu sortowania powłoki, weźmy nieposortowaną tablicę. Sortowanie powłoki będzie łatwiejsze do zrozumienia na przykładzie.

Niech elementami tablicy są -

dopełnianie CSS
Algorytm sortowania powłoki

Jako przedziały użyjemy oryginalnej sekwencji sortowania powłokowego, tj. N/2, N/4,.....,1.

W pierwszej pętli n jest równe 8 (rozmiar tablicy), więc elementy leżą w odstępie 4 (n/2 = 4). Elementy zostaną porównane i zamienione, jeżeli nie będą ułożone w odpowiedniej kolejności.

Tutaj, w pierwszej pętli, element na poziomie 0tpozycja zostanie porównana z elementem na 4tpozycja. Jeśli 0telement jest większy, zostanie zamieniony z elementem o wartości 4tpozycja. W przeciwnym razie pozostaje takie samo. Proces ten będzie kontynuowany dla pozostałych elementów.

W przedziale 4 podlisty to {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Algorytm sortowania powłoki

Teraz musimy porównać wartości na każdej podliście. Po porównaniu musimy je zamienić, jeśli jest to wymagane, w oryginalnej tablicy. Po porównaniu i zamianie zaktualizowana tablica będzie wyglądać następująco:

Algorytm sortowania powłoki

W drugiej pętli elementy leżą w odstępie 2 (n/4 = 2), gdzie n = 8.

Teraz bierzemy przedział 2 aby posortować resztę tablicy. W odstępie 2 zostaną wygenerowane dwie podlisty - {12, 25, 33, 40} i {17, 8, 31, 42}.

przekonwertuj ciąg na liczbę całkowitą
Algorytm sortowania powłoki

Teraz ponownie musimy porównać wartości na każdej podliście. Po porównaniu musimy je zamienić, jeśli jest to wymagane, w oryginalnej tablicy. Po porównaniu i zamianie zaktualizowana tablica będzie wyglądać następująco:

Algorytm sortowania powłoki

W trzeciej pętli elementy leżą w odstępie 1 (n/8 = 1), gdzie n = 8. Na koniec używamy przedziału o wartości 1 do sortowania pozostałych elementów tablicy. W tym kroku sortowanie powłokowe wykorzystuje sortowanie przez wstawianie do sortowania elementów tablicy.

Algorytm sortowania powłoki

Teraz tablica jest posortowana rosnąco.

Złożoność sortowania powłoki

Przyjrzyjmy się teraz złożoności czasowej sortowania Shella w najlepszym przypadku, średnim i najgorszym przypadku. Zobaczymy także złożoność przestrzenną sortowania powłoki.

1. Złożoność czasowa

Sprawa Złożoność czasu
Najlepszy przypadek O(n*log)
Przeciętny przypadek O(n*log(n)2)
Najgorszy przypadek NA2)
    Najlepsza złożoność przypadku —Występuje, gdy nie jest wymagane sortowanie, tj. tablica jest już posortowana. W najlepszym przypadku złożoność czasowa sortowania Shella wynosi O(n*logn). Średnia złożoność przypadku —Dzieje się tak, gdy elementy tablicy są w pomieszanej kolejności, która nie jest prawidłowo rosnąca i nieprawidłowo malejąca. Średnia złożoność czasowa sortowania powłoki wynosi O(n*logn). Najgorsza złożoność przypadku —Występuje, gdy elementy tablicy muszą zostać posortowane w odwrotnej kolejności. Oznacza to, że załóżmy, że musisz posortować elementy tablicy w kolejności rosnącej, ale jej elementy są w kolejności malejącej. Najgorszy przypadek złożoności czasowej sortowania Shella to NA2).

2. Złożoność przestrzeni

Złożoność przestrzeni O(1)
Stabilny NIE
  • Złożoność przestrzenna sortowania powłoki wynosi O (1).

Implementacja sortowania powłoki

Przyjrzyjmy się teraz programom Shella sortowanym w różnych językach programowania.

Program: Napisz program realizujący sortowanie powłoki w języku 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;>