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.

Travaux de tri des coquilles

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 :

Fonctionnement de l'algorithme de 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}.

Fonctionnement de l'algorithme de tri Shell

ร‰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 :

Fonctionnement de l'algorithme de tri Shell

ร‰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}

Fonctionnement de l'algorithme de tri Shell

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.

Fonctionnement de l'algorithme de tri Shell

Aprรจs avoir triรฉ la deuxiรจme sous-liste, le tableau d'origine sera :

Fonctionnement de l'algorithme de tri Shell

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.

Fonctionnement de l'algorithme de tri Shell

Fonctionnement de l'algorithme de tri Shell

Fonctionnement de l'algorithme de tri Shell

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-

Fonctionnement de l'algorithme de tri Shell

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

  1. Complexitรฉ du meilleur cas : O(n*log n)
  2. Complexitรฉ moyenne des cas : O(n*log n)
  3. 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).

Rรฉsumez cet article avec :