précédent | suivant | table des matières

Le tri Shell.

voir l'appliquette de visualisation

Imaginé par Donald Lewis Shell  (``A high-speed sorting procedure,'' Communications of the ACM, 2:30, 1959.) ce tri est une accélération du tri par insertion. Dans le tri par insertion, un élément va à sa place en progressant lentement, case par case. L'accélération consiste à le faire aller à sa place en commençant par faire des grands pas, puis des pas de plus en plus petits, jusqu'à, évidemment, des pas de 1 pour que le tableau soit trié.

La qualité du tri Shell va dépendre de la suite des valeurs de h. Une « bonne » suite est donnée par : 

void ShellSort(int a[]) {
    // calcul de la valeur initiale de h
    int h = 1;
    while ( h <= a.lenth) h = 3*h + 1;
    
    while ( h > 1) {
        h = h / 3;
        // tri par insertion des h tableaux
        for (int i = h; i < a.length; ++i){
            if (a[i] < a[i-h]) {
                 int   v = a[i], j = i;
                 while (j >= h  &&  a[j-h] > v) {
                       a[j] = a[j-h];
                       j = j - h;
                 };
                 a[j] = v;
            }
        }
    }
}

On peut imaginer d'autres suites pour h : ou encore un h tel que  

haut de la page