next up previous contents index
suivant: Définir une fonction par monter: Ordonner une séquence de précédent: Tri par insertion   Table des matières   Index

Tri par fusion

À chaque étape on partage la liste L en deux listes L1 er L2 de même longueur. On trie ces 2 listes grâce à 2 appels récursifs, puis on les fusionnne. Pour cela on écrit la fonction fusion qui fusionne 2 listes triées : à chaque étape on compare un élément de L1 avec un élément de L2, on met le plus petit des 2 dans la liste réponse et on avance l'indice correspondant au plus petit d'un cran et on recommence...
On tape :
fusion(L1,L2):={
local d1,d2,j1,j2,L;
 d1:=dim(L1)-1;
 d2:=dim(L2)-1;
 L:=[];
 j1:=0;
 j2:=0;
tantque j1<=d1 et j2<=d2 faire
 si L1[j1]<L2[j2] alors L:=append(L,L1[j1]); j1:=j1+1;
   sinon  L:=append(L,L2[j2]); j2:=j2+1;
 fsi;
ftantque;
si j1<=d1 alors L:=concat(L,mid(L1,j1);
 sinon   L:=concat(L,mid(L2,j2);
fsi;
retourne L;
}:;

Trifusion(L):={
  local d,d1,L1,L2;
  d:=dim(L);
  si d==1 ou d==0 alors retourne L;fsi;
  d1:=iquo(d,2);
  L1:=mid(L,0,d1);
  L2:=mid(L,d1);
  L1:=Trifusion(L1);
  L2:=Trifusion(L2);
  retourne fusion(L1,L2);
}:;

On peut améliorer le programme précédent en utilisant une liste que l'on modifie en place (avec l'opérateur =<) afin de ne pas recopier la liste L à chaque affectation par :=. Attention, cela nécessite de faire une copie de la liste vide initiale par copy sinon c'est la liste du programme lui-même qui sera modifiée et ne sera donc plus initialisée à une liste vide.

fusionenplace(L1,L2):={
local d1,d2,j1,j2,k,j,L;
 d1:=dim(L1)-1;
 d2:=dim(L2)-1;
 L:=copy([]);
 j1:=0;
 j2:=0;
 k:=0;
 tantque j1<=d1 et j2<=d2 faire
   si L1[j1]<L2[j2] alors L[k]=<L1[j1]; j1:=j1+1;
   sinon  L[k]=<L2[j2]; j2:=j2+1;
   fsi;
   k:=k+1;
 ftantque;
 pour j de j1 jusque d1 faire
   L[k]=<L1[j];
   k:=k+1;
 fpour;
 pour j de j2 jusque d2 faire
   L[k]=<L2[j];
   k:=k+1;
 fpour;
 retourne L;
}
:;
Trifusionenplace(L):={
  local L1,L2,d1,d;
  d:=dim(L);
  si d==1 ou d==0 alors retourne L;fsi;
  d1:=iquo(d,2);
  L1:=mid(L,0,d1);
  L2:=mid(L,d1);
  L1:=Trifusionenplace(L1);
  L2:=Trifusionenplace(L2);
  retourne fusionenplace(L1,L2);
}
:;


Documentation de giac écrite par Renée De Graeve