logo

Algoritmul de sortare Shell

În acest articol, vom discuta despre algoritmul de sortare shell. Sortarea shell este generalizarea sortării prin inserție, care depășește dezavantajele sortării prin inserție prin compararea elementelor separate printr-un interval de mai multe poziții.

Este un algoritm de sortare care este o versiune extinsă a sortării prin inserție. Sortarea Shell a îmbunătățit complexitatea timpului mediu al sortării prin inserare. Asemănător cu sortarea prin inserție, este un algoritm de sortare pe loc și bazat pe comparație. Sortarea Shell este eficientă pentru seturi de date de dimensiuni medii.

În sortarea prin inserare, la un moment dat, elementele pot fi mutate înainte doar cu o singură poziție. Pentru a muta un element într-o poziție îndepărtată, sunt necesare multe mișcări care măresc timpul de execuție al algoritmului. Dar sortarea shell depășește acest dezavantaj al sortării prin inserție. Permite mișcarea și schimbarea elementelor îndepărtate.

Acest algoritm sortează mai întâi elementele care sunt departe unele de altele, apoi reduce decalajul dintre ele. Acest decalaj se numește ca interval. Acest interval poate fi calculat utilizând a lui Knuth formula prezentată mai jos -

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

Acum, să vedem algoritmul de sortare shell.

Algoritm

Pașii simpli pentru realizarea sortării shell sunt enumerați după cum urmează -

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

Funcționarea algoritmului de sortare Shell

Acum, să vedem funcționarea algoritmului de sortare a shell-ului.

convertiți int în șir de caractere java

Pentru a înțelege funcționarea algoritmului de sortare shell, să luăm o matrice nesortată. Va fi mai ușor de înțeles sortarea shell-ului printr-un exemplu.

Fie elementele matricei sunt -

Algoritmul de sortare Shell

Vom folosi secvența originală de sortare shell, adică N/2, N/4,....,1 ca intervale.

convertiți data șirului

În prima buclă, n este egal cu 8 (dimensiunea matricei), deci elementele se află la intervalul de 4 (n/2 = 4). Elementele vor fi comparate și schimbate dacă nu sunt în ordine.

Aici, în prima buclă, elementul la 0thpoziția va fi comparată cu elementul de la 4thpoziţie. Dacă 0thelementul este mai mare, va fi schimbat cu elementul la 4thpoziţie. În rest, rămâne la fel. Acest proces va continua pentru elementele rămase.

La intervalul de 4, sublistele sunt {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Algoritmul de sortare Shell

Acum, trebuie să comparăm valorile din fiecare sub-listă. După comparare, trebuie să le schimbăm dacă este necesar în matricea originală. După comparare și schimbare, matricea actualizată va arăta după cum urmează -

Algoritmul de sortare Shell

În a doua buclă, elementele se află la intervalul de 2 (n/4 = 2), unde n = 8.

Acum, luăm intervalul de 2 pentru a sorta restul matricei. Cu un interval de 2, vor fi generate două subliste - {12, 25, 33, 40} și {17, 8, 31, 42}.

converti șirul în întreg
Algoritmul de sortare Shell

Acum, trebuie din nou să comparăm valorile din fiecare sub-listă. După comparare, trebuie să le schimbăm dacă este necesar în matricea originală. După comparare și schimbare, matricea actualizată va arăta după cum urmează -

Algoritmul de sortare Shell

În a treia buclă, elementele se află la intervalul de 1 (n/8 = 1), unde n = 8. În cele din urmă, folosim intervalul de valoare 1 pentru a sorta restul elementelor matricei. În acest pas, sortarea shell folosește sortarea prin inserție pentru a sorta elementele matricei.

Algoritmul de sortare Shell

Acum, matricea este sortată în ordine crescătoare.

Complexitatea sortării Shell

Acum, să vedem complexitatea temporală a sortării Shell în cel mai bun caz, caz mediu și cel mai rău caz. Vom vedea, de asemenea, complexitatea spațială a tipului Shell.

1. Complexitatea timpului

Caz Complexitatea timpului
Cel mai bun caz O(n*logn)
Caz mediu O(n*log(n)2)
Cel mai rău caz Pe2)
    Complexitatea celui mai bun caz -Apare atunci când nu este necesară sortarea, adică matricea este deja sortată. Cel mai bun caz complexitatea timpului a sortării Shell este O(n*logn). Complexitatea medie a cazului -Apare atunci când elementele matricei sunt într-o ordine amestecată care nu este corect ascendentă și nu este corect descendentă. Complexitatea medie a timpului de caz a sortării Shell este O(n*logn). Complexitatea celui mai rău caz -Apare atunci când elementele matricei trebuie să fie sortate în ordine inversă. Aceasta înseamnă să presupunem că trebuie să sortați elementele matricei în ordine crescătoare, dar elementele sale sunt în ordine descrescătoare. Cel mai rău caz complexitatea de timp a sortării Shell este Pe2).

2. Complexitatea spațială

Complexitatea spațială O(1)
Grajd NU
  • Complexitatea spațială a sortării Shell este O(1).

Implementarea sortării Shell

Acum, să vedem programele de sortare Shell în diferite limbaje de programare.

Program: Scrieți un program pentru a implementa sortarea Shell în limbajul 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;>