Algorithme de tri Shell avec EXEMPLE
Qu'est-ce que le tri par coque
La mรฉthode Shell, ou tri Shell dans la structure de donnรฉes, est un algorithme de tri par comparaison sur place efficace. Il porte le nom de Donald Shell lorsqu'il a proposรฉ l'idรฉe initiale en 1959. Le tri Shell est une extension gรฉnรฉralisรฉe de l'algorithme de tri par insertion.
Lโidรฉe fondamentale de cet algorithme de tri est de regrouper les รฉlรฉments รฉloignรฉs les uns des autres et de les trier en consรฉquence. Puis diminuez progressivement lโรฉcart entre eux. Le tri Shell surmonte la complexitรฉ moyenne du temps de tri par insertion en comparant et en รฉchangeant des รฉlรฉments รฉloignรฉs.
Cet รฉcart, appelรฉ intervalle, est rรฉduit selon certaines sรฉquences d'intervalles optimales. Le temps d'exรฉcution du tri shell dรฉpend รฉgalement de ces sรฉquences. Il existe plusieurs sรฉquences d'espacement, telles que la sรฉquence originale de Shell, la formule de Knuth, les incrรฉments de Hibbard, etc. La sรฉquence d'espacement originale de Shell est - n/2, n/4, n/8, โฆโฆโฆ.1
Algorithme de tri des coques
Les รฉtapes ou la procรฉdure de l'algorithme de tri du shell sont les suivantes :
รtape 1) Initialisez la valeur de l'intervalle, h = n/2. (Dans cet exemple, n est la taille du tableau)
รtape 2) Mettez tous les รฉlรฉments ร une distance de lโintervalle h dans une sous-liste.
รtape 3) Triez ces sous-listes en utilisant le tri par insertion.
รtape 4) Dรฉfinissez un nouvel intervalle, h=h/2.
รtape 5) Si h>0, passez ร lโรฉtape 2. Sinon, passez ร lโรฉtape 6.
รtape 6) La sortie rรฉsultante sera le tableau triรฉ.
Comment fonctionne le tri Shell
Dans le tri par insertion, les รฉlรฉments sont dรฉplacรฉs dโune seule position ร la fois. Au contraire, le tri shell divise le tableau en morceaux plus petits en fonction de la valeur de l'intervalle et exรฉcute un tri par insertion sur ces morceaux.
Progressivement, la valeur de l'intervalle diminue et la taille des morceaux divisรฉs augmente. Comme les piรจces sont triรฉes individuellement au prรฉalable, la fusion de ces piรจces nรฉcessite moins d'รฉtapes que le tri par insertion.
Le GIF suivant montre une dรฉmonstration du tri shell. Dans cette dรฉmo, les valeurs indiquรฉes en rouge et en bleu sont comparรฉes et รฉchangรฉes en fonction du tri par insertion. Ensuite, l'intervalle diminue et le tri shell lance le tri par insertion dans ces donnรฉes presque triรฉes.
Fonctionnement de l'algorithme de tri Shell
Voyons un exemple suivant d'algorithme de tri shell. Dans cet exemple, nous allons trier le tableau suivant ร l'aide du tri shell :
รtape 1) Ici, la taille du tableau est de 8. Ainsi, la valeur de l'intervalle sera h = 8/2 ou 4.
รtape 2) Maintenant, nous allons stocker tous les รฉlรฉments ร une distance de 4. Pour notre cas, les sous-listes sont - {8, 1}, {6, 4}, {7, 5}, {2, 3}.
รtape 3) Dรฉsormais, ces sous-listes seront triรฉes ร l'aide du tri par insertion, oรน une variable temporaire est utilisรฉe pour comparer les deux nombres et trier en consรฉquence.
Le tableau ressemblerait ร ce qui suit aprรจs les opรฉrations d'รฉchange :
รtape 4) Maintenant, nous allons diminuer la valeur initiale de l'intervalle. Le nouvel intervalle sera h=h/2 ou 4/2 ou 2.
รtape 5) Comme 2>0, nous passerons ร l'รฉtape 2 pour stocker tous les รฉlรฉments ร une distance de 2. Pour cette fois, les sous-listes sont-
{1, 5, 8, 7}, {4, 2, 6, 3}
Ensuite, ces sous-listes seront triรฉes par tri par insertion. Aprรจs avoir comparรฉ et รฉchangรฉ la premiรจre sous-liste, le tableau serait le suivant.
Aprรจs avoir triรฉ la deuxiรจme sous-liste, le tableau d'origine sera :
Lร encore, lโintervalle sera diminuรฉ. Maintenant, l'intervalle sera h=h/2 ou 2/1 ou 1. Nous utiliserons donc l'algorithme de tri par insertion pour trier le tableau modifiรฉ.
Voici la description procรฉdurale รฉtape par รฉtape du tri par insertion.
L'intervalle est ร nouveau divisรฉ par 2. A ce moment, l'intervalle devient 0. On passe donc ร l'รฉtape 6.
รtape 6) Comme l'intervalle est 0, le tableau est triรฉ selon cette heure. Le tableau triรฉ est-
Pseudo-code
Start
Input array an of size n
for (interval = n / 2; interval & gt; 0; interval /= 2)
for (i = interval; i & lt; n; i += 1)
temp = a[i];
for (j = i; j & gt; = interval & amp; & amp; a[j - interval] & gt; 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
Voici les applications importantes de Shell Sort :
- Le tri Shell est utilisรฉ dans le noyau Linux car il n'utilise pas de pile d'appels.
- La bibliothรจque uClbc utilise le tri Shell.
- Le compresseur bzip2 utilise le tri Shell pour arrรชter de dรฉpasser la rรฉcursion.
Avantages et inconvรฉnients du tri des coquilles
| Avantages | Dรฉsavantages |
|---|---|
| Aucun appel de pile n'est requis. | Pas efficace pour les tableaux de grande taille. |
| Mise en ลuvre facile. | Inefficace pour les รฉlรฉments largement rรฉpandus. |
| Efficace pour les รฉlรฉments moins espacรฉs. |
Analyse de la complexitรฉ du tri des coques
Complexitรฉ temporelle du tri des coques
La complexitรฉ temporelle de l'algorithme de tri shell est O(n^2). Le raisonnement est le suivant :
Pour le meilleur des cas, le nombre total de tests pour tous les intervalles lorsque le tableau รฉtait prรฉcรฉdemment disposรฉ est รฉgal ร log n. Ainsi, la complexitรฉ serait O(n*log n).
Dans le pire des cas, considรฉrons que le tableau est constituรฉ de telle maniรจre que les รฉlรฉments nรฉcessitent le plus grand nombre de comparaisons. Ensuite, tous les รฉlรฉments ne seront comparรฉs et commutรฉs quโร la derniรจre itรฉration. Par consรฉquent, le total des comparaisons requises pour lโincrรฉment final est O(n^2).
En conclusion, les complexitรฉs temporelles seraient
- Complexitรฉ du meilleur cas : O(n*log n)
- Complexitรฉ moyenne des cas : O(n*log n)
- Complexitรฉ dans le pire des cas : O(n^2)
La complexitรฉ du temps d'exรฉcution du tri shell dรฉpend fortement des sรฉquences d'incrรฉmentation d'espacement utilisรฉes. Cependant, la meilleure sรฉquence dโincrรฉments pour le tri shell est encore inconnue.
Complexitรฉ spatiale du tri des coques
Dans ce tri comparatif, nous nโavons besoin dโaucun espace auxiliaire supplรฉmentaire. Ainsi, la complexitรฉ spatiale de ce type dโalgorithme est O(1).










