Algorithme de tri Shell avec exemple
โก Rรฉsumรฉ intelligent
Le tri Shell est un algorithme de comparaison sur place qui gรฉnรฉralise le tri par insertion en comparant des รฉlรฉments trรจs รฉloignรฉs les uns des autres, puis en rรฉduisant l'รฉcart jusqu'ร ce que les รฉlรฉments adjacents soient triรฉs.

Qu'est-ce que le tri Shell ?
Le tri Shell, รฉgalement appelรฉ mรฉthode de Shell, est un algorithme de tri efficace basรฉ sur la comparaison en place. Nommรฉ d'aprรจs Donald Shell, qui a introduit cette idรฉe en 1959, il s'agit d'une gรฉnรฉralisation du tri par insertion qui pallie son comportement quadratique sur des donnรฉes dispersรฉes.
L'idรฉe fondamentale est de regrouper les รฉlรฉments รฉloignรฉs les uns des autres, de trier chaque groupe par insertion, et de rรฉduire progressivement l'รฉcart jusqu'ร ce qu'il atteigne un. Le tableau est alors presque triรฉ.
Cet intervalle, ce laps de temps, suit une sรฉquence choisie, comme celle de Shell, de Knuth, d'Hibbard ou de Sedgewick. La version originale de Shell est : n/2, n/4, ..., 1.
Algorithme de tri des coques
รtape 1) Initialisez la valeur d'intervalle h = n/2, oรน n est la taille du tableau.
รtape 2) Placez tous les รฉlรฉments situรฉs ร une distance de l'intervalle h dans une sous-liste.
รtape 3) Triez chaque sous-liste en utilisant le tri par insertion.
รtape 4) Dรฉfinissez un nouvel intervalle h = h/2.
รtape 5) Si h > 0, retournez ร l'รฉtape 2. Sinon, passez ร l'รฉtape 6.
รtape 6) Le tableau rรฉsultant est dรฉsormais entiรจrement triรฉ.
Comment fonctionne le tri Shell
Dans le tri par insertion, les รฉlรฉments se dรฉplacent d'une position ร la fois. Le tri Shell, quant ร lui, divise le tableau en sous-listes largement espacรฉes en fonction de l'intervalle et effectue un tri par insertion sur chaque sous-liste.
ร mesure que l'intervalle diminue, la taille de la sous-liste augmente. Comme les passages prรฉcรฉdents laissent les donnรฉes partiellement triรฉes, les intervalles plus petits nรฉcessitent beaucoup moins d'รฉchanges que les passages en cours. tri par insertion ร partir de zรฉro. La figure ci-dessous illustre une passe de tri Shell.
Fonctionnement de l'algorithme de tri Shell avec exemple
Trions le tableau ci-dessous ร l'aide de Shell Sort.
รtape 1) La taille du tableau est de 8, donc la valeur de l'intervalle initial est h = 8/2 = 4.
รtape 2) Regroupez les รฉlรฉments ร quatre positions d'รฉcart. Sous-listes : {8, 1}, {6, 4}, {7, 5}, {2, 3}.
รtape 3) Triez chaque sous-liste par insertion. Une variable temporaire stocke la valeur insรฉrรฉe pendant le dรฉplacement des รฉlรฉments. Aprรจs les รฉchanges, le tableau ressemble ร ceci.
รtape 4) Diminuez l'intervalle. Le nouvel intervalle est h = 4/2 = 2.
รtape 5) Parce que 2 > 0, retournez ร l'รฉtape 2 et regroupez les รฉlรฉments ร deux positions d'รฉcart : {1, 5, 8, 7} et {4, 2, 6, 3}.
Triez la premiรจre sous-liste. Le tableau devient :
Aprรจs avoir triรฉ la deuxiรจme sous-liste :
Diminuez ร nouveau l'intervalle ร h = 2/2 = 1. Avec un รฉcart d'un, Shell Sort effectue un dernier passage de tri par insertion sur l'ensemble du tableau, comme indiquรฉ ci-dessous.
รtape 6) En divisant ร nouveau l'intervalle, on obtient 0. Le tableau est maintenant entiรจrement triรฉ :
Pseudo-Code pour le tri des coquillages
Start Input array a of size n for (interval = n / 2; interval > 0; interval /= 2) for (i = interval; i < n; i += 1) temp = a[i]; for (j = i; j >= interval && a[j - interval] > temp; j -= interval) a[j] = a[j - interval]; a[j] = temp; End
Programme de tri Shell en C/C++
Entrรฉes :
//Shell Sort Program in C/C++ #include <bits/stdc++.h> using namespace std; void ShellSort(int data[], int size) { for (int interval = size / 2; interval > 0; interval /= 2) { for (int i = interval; i < size; i += 1) { int temp = data[i]; int j; for (j = i; j >= interval && data[j - interval] > temp; j -= interval) { data[j] = data[j - interval]; } data[j] = temp; } } } int main() { int data[] = {8, 6, 7, 2, 1, 4, 5, 3}; int size = sizeof(data) / sizeof(data[0]); ShellSort(data, size); cout << "Sorted Output: \n"; for (int i = 0; i < size; i++) cout << data[i] << " "; cout << "\n"; }
Sortie :
Sorted Output:
1 2 3 4 5 6 7 8
Exemple de tri de shell dans Python
Entrรฉes :
#Shell Sort Example in Python def ShellSort(data, size): interval = size // 2 while interval > 0: for i in range(interval, size): temp = data[i] j = i while j >= interval and data[j - interval] > temp: data[j] = data[j - interval] j -= interval data[j] = temp interval //= 2 data = [8, 6, 7, 2, 1, 4, 5, 3] ShellSort(data, len(data)) print('Sorted Output:') print(data)
Sortie :
Sorted Output:
[1, 2, 3, 4, 5, 6, 7, 8]
Applications du tri des coques
Le tri Shell est encore prรฉsent dans les systรจmes modernes oรน l'espace de pile ou la simplicitรฉ sont importants.
- Le noyau Linux Utilise Shell Sort dans les cas oรน il est important d'รฉviter une pile d'appels.
- La bibliothรจque C embarquรฉe uClibc utilise Shell Sort pour limiter l'utilisation de la mรฉmoire.
- bzip2 utilise Shell Sort pour รฉviter une rรฉcursion profonde lors du tri des blocs.
- Le firmware embarquรฉ privilรฉgie le tri Shell pour les petits ensembles de donnรฉes oรน la rรฉcursivitรฉ est limitรฉe.
Avantages et inconvรฉnients du tri par coquille
| Avantages | Dรฉsavantages |
|---|---|
| Aucune pile d'appels n'est requise, ce qui est idรฉal pour les systรจmes embarquรฉs. | Ce n'est pas l'option la plus rapide pour les trรจs grands rรฉseaux. |
| Facile ร mettre en ลuvre avec peu de code. | Les performances se dรฉgradent sur les donnรฉes comportant des รฉlรฉments trรจs dispersรฉs. |
| Efficace pour les tableaux de taille moyenne ou partiellement triรฉs. | La complexitรฉ temporelle dans le pire des cas est sensible ร la sรฉquence d'intervalles choisie. |
| Fonctionnant sur place, il utilise donc une mรฉmoire auxiliaire constante. | Il ne s'agit pas d'un tri stable, donc l'ordre relatif des clรฉs รฉgales peut changer. |
Analyse de la complexitรฉ du tri des coques
Complexitรฉ temporelle du tri des coques
La complexitรฉ temporelle du tri Shell dรฉpend de la sรฉquence d'intervalles utilisรฉe.
Dans le meilleur des cas, lorsque le tableau est dรฉjร presque organisรฉ, chaque passage ne nรฉcessite qu'un nombre logarithmique de tests, ce qui donne O(n log n).
Dans le pire des cas, le tableau est agencรฉ de telle sorte que les รฉlรฉments nรฉcessitent le maximum de comparaisons, et l'incrรฉment final domine ร O(n^2) avec la sรฉquence originale de Shell.
- Complexitรฉ du meilleur cas : O(n log n)
- Complexitรฉ moyenne : O(n log n) ร O(n^(4/3)) selon la sรฉquence d'intervalles
- Complexitรฉ dans le pire des cas : O(n^2) avec la sรฉquence originale de Shell
La meilleure sรฉquence d'intervalles ร usage gรฉnรฉral reste une question de recherche ouverte, bien que les sรฉquences de Sedgewick et de Ciura donnent de bons rรฉsultats en pratique.
Complexitรฉ spatiale du tri des coques
Le tri Shell ne nรฉcessite pas de tableaux auxiliaires, donc la complexitรฉ spatiale est O(1) quelle que soit la taille de l'entrรฉe, ce qui est l'un de ses plus grands avantages pratiques.










