logo

Algoritme d'ordenació de Shell

En aquest article, parlarem de l'algorisme d'ordenació de l'intèrpret d'ordres. L'ordenació de shell és la generalització de l'ordenació d'inserció, que supera els inconvenients de l'ordenació d'inserció comparant elements separats per un buit de diverses posicions.

És un algorisme d'ordenació que és una versió ampliada de l'ordenació per inserció. L'ordenació de shell ha millorat la complexitat del temps mitjà de l'ordenació d'inserció. Igual que l'ordenació per inserció, és un algorisme d'ordenació basat en comparacions i al lloc. L'ordenació de shell és eficient per a conjunts de dades de mida mitjana.

tostring java

En l'ordenació per inserció, a la vegada, els elements es poden moure cap endavant només per una posició. Per moure un element a una posició llunyana, calen molts moviments que augmenten el temps d'execució de l'algorisme. Però l'ordenació de shell supera aquest inconvenient de l'ordenació d'inserció. També permet el moviment i l'intercanvi d'elements llunyans.

Aquest algorisme ordena primer els elements que estan lluny els uns dels altres i, posteriorment, redueix la bretxa entre ells. Aquest buit s'anomena com interval. Aquest interval es pot calcular utilitzant el de Knuth fórmula que es mostra a continuació -

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

Ara, anem a veure l'algoritme d'ordenació de shell.

Algorisme

Els passos senzills per aconseguir l'ordenació de shell s'enumeren de la següent manera:

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

Funcionament de l'algoritme d'ordenació de Shell

Ara, vegem el funcionament de l'algoritme d'ordenació de l'intèrpret d'ordres.

Per entendre el funcionament de l'algorisme d'ordenació de l'intèrpret d'ordres, prenem una matriu sense ordenar. Serà més fàcil entendre l'ordenació de l'intèrpret d'ordres mitjançant un exemple.

Siguin els elements de la matriu -

Algoritme d'ordenació de Shell

Utilitzarem la seqüència original d'ordenació de shell, és a dir, N/2, N/4,....,1 com a intervals.

En el primer bucle, n és igual a 8 (mida de la matriu), de manera que els elements es troben a l'interval de 4 (n/2 = 4). Els elements es compararan i s'intercanviaran si no estan en ordre.

Aquí, en el primer bucle, l'element al 0thla posició es compararà amb l'element a 4thposició. Si el 0thelement és més gran, s'intercanviarà amb l'element a 4thposició. En cas contrari, segueix sent igual. Aquest procés continuarà per als elements restants.

els 10 millors hentai

A l'interval de 4, les subllistes són {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Algoritme d'ordenació de Shell

Ara, hem de comparar els valors de cada subllista. Després de comparar, hem d'intercanviar-los si és necessari a la matriu original. Després de comparar i intercanviar, la matriu actualitzada tindrà el següent aspecte:

Algoritme d'ordenació de Shell

En el segon bucle, els elements es troben a l'interval de 2 (n/4 = 2), on n = 8.

Ara, estem prenent l'interval de 2 per ordenar la resta de la matriu. Amb un interval de 2, es generaran dues subllistes: {12, 25, 33, 40} i {17, 8, 31, 42}.

Algoritme d'ordenació de Shell

Ara, hem de tornar a comparar els valors de cada subllista. Després de comparar, hem d'intercanviar-los si és necessari a la matriu original. Després de comparar i intercanviar, la matriu actualitzada tindrà el següent aspecte:

Algoritme d'ordenació de Shell

En el tercer bucle, els elements es troben a l'interval d'1 (n/8 = 1), on n = 8. Finalment, utilitzem l'interval de valor 1 per ordenar la resta d'elements de la matriu. En aquest pas, l'ordenació de shell utilitza l'ordenació d'inserció per ordenar els elements de la matriu.

Algoritme d'ordenació de Shell

Ara, la matriu s'ordena en ordre ascendent.

Complexitat d'ordenació de Shell

Ara, vegem la complexitat temporal de l'ordenació de Shell en el millor dels casos, el cas mitjà i el pitjor. També veurem la complexitat espacial del tipus Shell.

1. Complexitat temporal

Caixa Complexitat temporal
Millor cas O(n*inici de sessió)
Cas mitjà O(n*log(n)2)
Pitjor dels casos O (n2)
    Complexitat del millor cas -Es produeix quan no cal ordenar, és a dir, la matriu ja està ordenada. La complexitat temporal del millor dels casos de l'ordenació de Shell és O(n*logn). Complexitat mitjana de casos -Es produeix quan els elements de la matriu estan en ordre desordenat que no és correctament ascendent i no descendent correctament. La complexitat mitjana del temps de cas de l'ordenació de Shell és O(n*logn). Complexitat del pitjor cas -Es produeix quan els elements de la matriu s'han d'ordenar en ordre invers. Això vol dir que suposem que heu d'ordenar els elements de la matriu en ordre ascendent, però els seus elements estan en ordre descendent. La complexitat temporal del pitjor dels casos de l'ordenació de Shell és O (n2).

2. Complexitat espacial

Complexitat espacial O(1)
Estable NO
  • La complexitat espacial de l'ordenació Shell és O(1).

Implementació del tipus Shell

Ara, vegem els programes de Shell ordenats en diferents llenguatges de programació.

Programa: Escriu un programa per implementar l'ordenació de Shell en llenguatge 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;>