Next: Tri rapide
Up: Tri d'un tableau
Previous: Tri d'un tableau
En appliquant la méthode << diviser pour régner >> au problème du tri
d'un tableau, on obtient facilement le tri par fusion (en anglais,
mergesort) : on divise une table de longueur n en deux tables
de longueur n/2, on trie, récursivement, ces deux tables, puis on
fusionne les tables triées. Comme la fusion de deux tables ordonnées de
longueur n/2 se fait en ,
l'équation de complexité est
,
dont la solution est en
.
Ce tri est implémenté dans les fonctions
Collections.sort(List l) et Arrays.sort(Object[] t) de
l'API, pour trier respectivement des listes et des tableaux d'objets.
Voici une version optimisée de ce tri. Pour trier un tableau t, on
commence par en créer une copie c, puis on appelle la fonction
récursive triFusion() qui écrit dans t le résultat du tri de
c ; chaque invocation récursive échange le rôle des tableaux source et
destination :
static void triFusion(Object[] t) {
Object[] copie = (Object[])t.clone();
triFusion(copie, t, 0, t.length);
}
static void triFusion(Object source[], Object destination[],
int début, int fin) {
int longueur = fin - début;
if (longueur <= 1) return;
else {
int milieu = (début + fin)/2;
triFusion(destination, source, début, milieu);
// source est trié de début à milieu
triFusion(destination, source, milieu, fin);
// source est trié de milieu à fin
// Fusion des tableaux triés dans destination
for (int i = début, p = début, q = milieu;
i < fin;
i++) {
if (q>=fin || p<milieu &&
((Comparable)source[p]).compareTo(source[q])<=0) {
destination[i] = source[p];
p++;
} else {
destination[i] = source[q];
q++;
}
}
// destination est trié de debut à fin
}
}
Outre sa complexité en
,
le tri par fusion a l'avantage
d'être stable, c'est-à-dire que des éléments de même clé ne sont pas
échangés. Ceci permet de trier successivement un tableau selon plusieurs
clés et de conserver l'ordre obtenu lors des tris précédents.
Next: Tri rapide
Up: Tri d'un tableau
Previous: Tri d'un tableau
R. Lalement
2000-10-23