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); } :;