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.

  • (I.e. Dรฉfinition: Une gรฉnรฉralisation en place du tri par insertion proposรฉe par Donald Shell en 1959 qui utilise une sรฉquence d'espacement dรฉcroissante.
  • ๐Ÿ”€ Sรฉquences d'intervalles : La sรฉquence originale de Shell est n/2, n/4, โ€ฆ, 1 ; les sรฉquences de Knuth, Sedgewick et Ciura sont plus performantes en pratique.
  • | Complexitรฉ: O(n log n) dans le meilleur des cas, O(n^2) dans le pire des cas et O(1) espace auxiliaire.
  • โœ… Cas d'utilisation: Le noyau Linux, uClibc et bzip2 utilisent Shell Sort pour รฉviter la rรฉcursivitรฉ et la mรฉmoire de pile supplรฉmentaire.
  • ๐Ÿค– Angle d'approche IA : Les assistants IA peuvent suggรฉrer des sรฉquences d'intervalles et gรฉnรฉrer ร  la demande des visualisations animรฉes de tri Shell.

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.

Travaux de tri des coquilles

Fonctionnement de l'algorithme de tri Shell avec exemple

Trions le tableau ci-dessous ร  l'aide de Shell Sort.

Fonctionnement de l'algorithme de tri Shell

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

Fonctionnement de l'algorithme de tri Shell

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

Fonctionnement de l'algorithme de tri Shell

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

Fonctionnement de l'algorithme de tri Shell

Triez la premiรจre sous-liste. Le tableau devient :

Fonctionnement de l'algorithme de tri Shell

Aprรจs avoir triรฉ la deuxiรจme sous-liste :

Fonctionnement de l'algorithme de tri Shell

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.

Fonctionnement de l'algorithme de tri Shell

Fonctionnement de l'algorithme de tri Shell

Fonctionnement de l'algorithme de tri Shell

ร‰tape 6) En divisant ร  nouveau l'intervalle, on obtient 0. Le tableau est maintenant entiรจrement triรฉ :

Fonctionnement de l'algorithme de tri Shell

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.

  1. Complexitรฉ du meilleur cas : O(n log n)
  2. Complexitรฉ moyenne : O(n log n) ร  O(n^(4/3)) selon la sรฉquence d'intervalles
  3. 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.

FAQ

Le tri Shell est un algorithme de tri par comparaison sur place proposรฉ par Donald Shell en 1959. Il gรฉnรฉralise le tri par insertion en comparant des รฉlรฉments รฉloignรฉs les uns des autres, puis en rรฉduisant l'รฉcart jusqu'ร  ce que les รฉlรฉments adjacents soient triรฉs, ce qui rรฉduit considรฉrablement le nombre d'รฉchanges.

La complexitรฉ temporelle dans le meilleur des cas est O(n log n), et dans le pire des cas, O(nยฒ) avec la sรฉquence originale de Shell. Des sรฉquences ร  intervalles optimisรฉes, comme celle de Sedgewick, rรฉduisent la complexitรฉ dans le pire des cas ร  environ O(nโด/ยณ). La complexitรฉ spatiale est O(1).

Non, le tri Shell n'est pas stable. Les รฉlรฉments รฉtant comparรฉs et permutรฉs malgrรฉ de grands รฉcarts, deux clรฉs identiques peuvent changer d'ordre relatif au cours d'une mรชme passe. Si la stabilitรฉ est importante, utilisez plutรดt le tri fusion ou une variante stable du tri par insertion.

Le tri par insertion dรฉplace les รฉlรฉments d'une position ร  la fois. Le tri Shell compare d'abord les รฉlรฉments รฉloignรฉs les uns des autres, puis rรฉduit progressivement cet รฉcart. Le rรฉsultat est un tableau presque triรฉ lorsque l'รฉcart atteint une position, ce qui permet ร  la derniรจre passe du tri par insertion de s'effectuer trรจs rapidement.

Les assistants IA peuvent analyser la taille, la distribution et les contraintes de votre ensemble de donnรฉes, puis recommander un algorithme tel que le tri Shell, le tri rapide ou le tri par base. Ils peuvent รฉgalement gรฉnรฉrer des scripts de test comparant le temps d'exรฉcution et l'utilisation de la mรฉmoire, ce qui vous permet de valider la recommandation sur des charges de travail rรฉelles.

Oui. Les outils d'IA peuvent gรฉnรฉrer des visualisations animรฉes du tri Shell qui mettent en รฉvidence les groupes d'รฉlรฉments manquants, les comparaisons et les รฉchanges en temps rรฉel. Ces visualisations aident les apprenants ร  comprendre comment l'intervalle se rรฉduit et comment le tableau converge vers un รฉtat triรฉ, itรฉration aprรจs itรฉration.

Rรฉsumez cet article avec :