précédent | suivant | table des matières
L’idée consiste à comparer deux éléments adjacents, et à les échanger s’ils ne sont pas dans l’ordre. Lorsqu’on réalise un passage, on range le plus grand élément en fin de tableau ( ou le plus petit en début ). On a donc réalisé une partition entre l’élément le plus grand d’une part, et tous les autres éléments d’autre part.
void triBulles1(int t[]){ for (int i=t.length-1; i>=0; --i) for (int j=0; j<i; ++j) if (t[j+1] < t[j]) { // comparer deux voisins int tmp = t[j]; // les échanger si nécessaire t[j] = t[j+1]; t[j+1] = tmp; } }
L’algorithme est clairement en un nombre de comparaisons de l’ordre de , il n’est pas de bonne qualité, et pratiquement c’est même le plus mauvais tri.
On peut tenter d’accélérer l’algorithme en constatant que si le dernier échange se produit à l’indice dernierEchange, alors tous les éléments compris entre dernierEchange et i sont en ordre et à leur place. |
void triBulles2(int t[]){ int dernierEchange; for(int i=t.length-1; i>=0; ){ dernierEchange = -1; for (int j=0; j<i; j++) if (t[j+1] < t[j]) { // comparer deux voisins int tmp = t[j]; // les échanger si nécessaire t[j] = t[j+1]; t[j+1] = tmp; dernierEchange = j; } i = dernierEchange; } }