logo

Algorithme de tri des coques

Dans cet article, nous discuterons de l’algorithme de tri shell. Le tri Shell est la généralisation du tri par insertion, qui pallie les inconvénients du tri par insertion en comparant des éléments séparés par un espace de plusieurs positions.

Il s'agit d'un algorithme de tri qui est une version étendue du tri par insertion. Le tri Shell a amélioré la complexité temporelle moyenne du tri par insertion. Tout comme le tri par insertion, il s'agit d'un algorithme de tri basé sur une comparaison et sur place. Le tri Shell est efficace pour les ensembles de données de taille moyenne.

Dans le tri par insertion, les éléments à la fois ne peuvent être avancés que d'une seule position. Pour déplacer un élément vers une position éloignée, de nombreux mouvements sont nécessaires qui augmentent le temps d'exécution de l'algorithme. Mais le tri shell surmonte cet inconvénient du tri par insertion. Il permet également le mouvement et l’échange d’éléments éloignés.

Cet algorithme trie d’abord les éléments éloignés les uns des autres, puis réduit ensuite l’écart entre eux. Cet écart est appelé intervalle. Cet intervalle peut être calculé en utilisant la Knuth formule donnée ci-dessous -

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

Voyons maintenant l'algorithme de tri du shell.

Algorithme

Les étapes simples pour réaliser le tri des shells sont répertoriées comme suit :

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

Fonctionnement de l'algorithme de tri Shell

Voyons maintenant le fonctionnement de l'algorithme de tri shell.

Pour comprendre le fonctionnement de l'algorithme de tri du shell, prenons un tableau non trié. Il sera plus facile de comprendre le tri shell via un exemple.

Soit les éléments du tableau -

types de données SQL
Algorithme de tri des coques

Nous utiliserons la séquence originale de tri shell, c'est-à-dire N/2, N/4,....,1 comme intervalles.

Dans la première boucle, n est égal à 8 (taille du tableau), donc les éléments sont espacés de 4 (n/2 = 4). Les éléments seront comparés et échangés s’ils ne sont pas dans l’ordre.

Ici, dans la première boucle, l'élément au 0èmela position sera comparée à l'élément en 4èmeposition. Si le 0èmel'élément est plus grand, il sera échangé avec l'élément à 4èmeposition. Sinon, ça reste pareil. Ce processus se poursuivra pour les éléments restants.

A l'intervalle de 4, les sous-listes sont {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Algorithme de tri des coques

Maintenant, nous devons comparer les valeurs de chaque sous-liste. Après comparaison, nous devons les échanger si nécessaire dans le tableau d'origine. Après comparaison et échange, le tableau mis à jour ressemblera à ceci :

Algorithme de tri des coques

Dans la deuxième boucle, les éléments se situent à un intervalle de 2 (n/4 = 2), où n = 8.

Maintenant, nous prenons l'intervalle de 2 pour trier le reste du tableau. Avec un intervalle de 2, deux sous-listes seront générées : {12, 25, 33, 40} et {17, 8, 31, 42}.

gigaoctet contre mégaoctet
Algorithme de tri des coques

Maintenant, nous devons à nouveau comparer les valeurs de chaque sous-liste. Après comparaison, nous devons les échanger si nécessaire dans le tableau d'origine. Après comparaison et échange, le tableau mis à jour ressemblera à ceci :

Algorithme de tri des coques

Dans la troisième boucle, les éléments se situent à l'intervalle de 1 (n/8 = 1), où n = 8. Enfin, nous utilisons l'intervalle de valeur 1 pour trier le reste des éléments du tableau. Dans cette étape, le tri shell utilise le tri par insertion pour trier les éléments du tableau.

Algorithme de tri des coques

Désormais, le tableau est trié par ordre croissant.

Complexité du tri Shell

Voyons maintenant la complexité temporelle du tri Shell dans le meilleur des cas, le cas moyen et le pire des cas. Nous verrons également la complexité spatiale du type Shell.

1. Complexité temporelle

Cas Complexité temporelle
Meilleur cas O(n*logn)
Cas moyen O(n*log(n)2)
Pire cas Sur2)
    Complexité du meilleur cas -Cela se produit lorsqu'aucun tri n'est requis, c'est-à-dire que le tableau est déjà trié. La complexité temporelle dans le meilleur des cas du tri Shell est O(n*logn). Complexité moyenne des cas -Cela se produit lorsque les éléments du tableau sont dans un ordre confus qui n'est pas correctement ascendant ni correctement descendant. La complexité temporelle moyenne des cas du tri Shell est O(n*logn). Pire complexité des cas -Cela se produit lorsque les éléments du tableau doivent être triés dans l’ordre inverse. Cela signifie que vous devez trier les éléments du tableau par ordre croissant, mais que ses éléments sont par ordre décroissant. La complexité temporelle du tri Shell dans le pire des cas est Sur2).

2. Complexité spatiale

Complexité spatiale O(1)
Écurie NON
  • La complexité spatiale du tri Shell est O(1).

Implémentation du tri Shell

Voyons maintenant les programmes de Shell triés dans différents langages de programmation.

Programme: Écrivez un programme pour implémenter le tri Shell en langage 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;>