Saisir un mot clé:
 
 

Tri_à_bulles

Ce site est un miroir du site http://fr.wikipedia.org/wiki/Accueil
ok

var wgArticlePath = "/encyclopedie_$1";

Tri à bulles

Un article de Wikipédia, l'encyclopédie libre.

Exemple du tri à bulles utilisant une liste de nombres aléatoires
Exemple du tri à bulles utilisant une liste de nombres aléatoires

Le tri à bulles ou tri par propagation est un algorithme de tri qui consiste à faire remonter progressivement les plus petits éléments d'une liste, comme les bulles d'air remontent à la surface d'un liquide. L'algorithme parcourt la liste, et compare les couples d'éléments successifs. Lorsque deux éléments successifs ne sont pas dans l'ordre croissant, ils sont échangés. Après chaque parcours complet de la liste, l'algorithme recommence l'opération. Lorsqu'aucun échange n'a lieu pendant un parcours, cela signifie que la liste est triée : l'algorithme peut s'arrêter.

Cet algorithme est souvent enseigné en tant qu'exemple algorithmique. Cependant, il présente une complexité en ?(n²) dans le pire des cas (où n est la longueur de la liste), ce qui le classe parmi les mauvais algorithmes de tri. Il n'est donc quasiment pas utilisé en pratique.

Sommaire

[] Complexité

Pour un tableau de taille n, la boucle for sera exécutée n-1 fois et while sera exécutée une fois si permut == faux, c'est-à-dire le tableau est trié n-1 fois si permut est vrai.

  • Meilleur cas : O(n) le tableau est trié : n * 1 = o(n)
  • Pire cas: o(n²) le tableau est trié en ordre inverse (n -1)*(n-1) = o(n²)

Le nombre d'échanges de paires d'éléments successifs est égal au nombre de couples (i,j) tels que i < j et A(i) > A(j). Ce nombre d'échanges est indépendant de la manière d'organiser les échanges. Pour un tableau aléatoire, il est en moyenne égal à N(N-1) \over 4.

Un dérivé du tri à bulles est le shakersort ou tri cocktail. Cette méthode de tri est basée sur une simple observation du comportement du tri à bulles : quand on fait un passage pour trier le maximum du tableau, on a tendance à déplacer les éléments les plus petits du tableau vers le début de celui-ci. Donc l'astuce consiste à alterner les sens de passage de notre bulle. Bien que le nombre d'échanges à effectuer soit identique (voir ci-dessus), on obtient un tri un peu plus rapide que la bulle. En effet, lors des changements de sens, cet algorithme relit les données les plus récentes et qui sont donc encore dans le tampon (cache) de la mémoire. Mais le temps d'exécution est toujours proportionnel à N2 donc médiocre.

[] Exemple étape par étape

Prenons la liste de chiffres suivante "5 1 4 2 8" et trions-la de manière croissante en utilisant l'algorithme de tri à bulles. Pour chaque étape, les élément comparés sont écrits en gras.

Première étape:
( 5 1 4 2 8 ) \to ( 1 5 4 2 8 ) Ici, l'algorithme compare les deux premiers éléments (5 et 1) et les intervertit. (x)
( 1 5 4 2 8 ) \to ( 1 4 5 2 8 )
( 1 4 5 2 8 ) \to ( 1 4 2 5 8 )
( 1 4 2 5 8 ) \to ( 1 4 2 5 8 ) Maintenant que ces deux éléments (5 et 8) sont triés (rangés), l'algorithme ne les intervertira plus.
Deuxième étape:
( 1 4 2 5 8 ) \to ( 1 4 2 5 8 ) On recommence les mêmes opérations, voir \to(x)
( 1 4 2 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
A ce stade, la liste est triée, mais l'algorithme ne sait pas si le travail (le tri) est terminé. L'algorithme doit effectuer un passage sans aucune interversion (échange) pour savoir si le travail est terminé.
Troisième étape:
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
( 1 2 4 5 8 ) \to ( 1 2 4 5 8 )
Ici, la liste est triée et l'algorithme peut se terminer.

[] Implémentations

Une mise en ?uvre simple du tri à bulles sur un tableau d'entiers en C :

#define TRUE 1
#define FALSE 0
typedef int tab_entiers[MAX];
 
void tri_a_bulle(tab_entiers t) 
{
        int i   = 0; /* Indice de répétition du tri */
        int j   = 0; /* Variable de boucle */
        int tmp = 0; /* Variable de stockage temporaire */
 
        /* Booléen marquant l'arrêt du tri si le tableau est ordonné */
        int en_desordre = TRUE; 
        /* Boucle de répétition du tri et le test qui
           arrête le tri dès que le tableau est ordonné */
        for(i = 0 ; (i < MAX) && en_desordre; i++)
        {
                /* Supposons le tableau ordonné */
                en_desordre = FALSE;
                /* Vérification des éléments des places j et j-1 */
                for(j = 1 ; j < MAX - i ; j++)
                {
                        /* Si les 2 éléments sont mal triés */
                        if(t[j] < t[j-1])
                        {
                                /* Inversion des 2 éléments */
                                tmp = t[j-1];
                                t[j-1] = t[j];
                                t[j] = tmp;
 
                                /* Le tableau n'est toujours pas trié */
                                en_desordre = TRUE;
                        }
                }
        }
}

Une amélioration en C++ :

void tri_a_bulle(int *t, int const size) 
{
        bool en_desordre=true;
        for (int i = 0; i < size && en_desordre; ++i)
        {
                en_desordre = false;
                for (int j = 1; j < size - i; ++j)
                        if (t[j] < t[j - 1])
                        {
                                int tmp = t[j - 1];
                                t[j - 1] = t[j];
                                t[j] = tmp;
                                en_desordre = true;
                        }
        }
}

Une implémentation en Pascal (en ordre croissant) :

const
  MAX = 100; (* MAX = 100 est donné en exemple seulement *)
 
type
  tab = array [1..MAX] of integer;
 
procedure TriBulle(n: integer ; var t: tab);
var
  i, j, tmp: integer;
 
begin
  (* On va trier les n-1 premiers éléments du tableau *)
  for i := 1 to n - 1 do
    begin
      for j := 1 to n - i do   (* on fait n-i-1 comparaisons en avançant dans le tableau *)
        begin
          if(t[j + 1] < t[j]) then
             begin
                tmp := t[j];
                t[j] := t[j + 1];
                t[j+1] := tmp;
             end;
        end;
    end;
end;

Une implémentation en Java :

public static void triBulle(int tableau[])
       {
       int longueur=tableau.length;
       boolean permut;
 
       do
           {
           //hypothése : le tableau est trié
           permut=false;
           for(int i=0;i<longueur-1;i++)
               {
               //Teste si 2 éléments successifs sont dans le bon ordre ou non
               if(tableau[i]>tableau[i+1])
                   {
                   //s'ils ne le sont pas on échange leurs positions
                   echanger(tableau,i,i+1);
                   permut=true;
                   }
               }
            }
       while(permut);
       }
  • Une implémentation en PHP :
function bubble_sort($array)
{
    $count = count($array);
    if ($count <= 0) return false;
    $ok = false;
    for($i=0; $i<$count && !$ok; $i++)
    {
        $ok = true;
        for($j=$count-1; $j>$i; $j?-)
        {
            if ($array[$j] < $array[$j-1])
            {
                $tmp = $array[$j];
                $array[$j] = $array[$j-1];
                $array[$j-1] = $tmp;
                $ok = false;
             }
         }
     }
    return $array;
}

[] Liens externes


Mirror_ebab  
Le Texte ci-dessus est disponible sous GNU Free Documentation License.
La source est wikipedia http://fr.wikipedia.org/wiki/Tri à bulles
Home

Données
A la une
Articles
Formatons en lignes
Téléchargement
Licence GNU
Encyclopedie
Portail logiciels libres

Partenaires

beyrouthsurseine.com
Sonnerie & Logos
Photos-Video
Ringtones-Sonnerie
Actualite.org
Terrain tennis

  
Novembre 2008
L
M
M
J
V
S
D
1 2
3456789
1011 1213141516
17181920212223
24252627282930
     
Tous les Logos et Marques sont déposés, les commentaires sont sous la responsabilité de ceux qui les ont publiés, le reste © technicmania.com