| 3 | 1 | 4 | 5 | 2 | 9 | 6 | 7 |
| 3 | 4 | 9 | 6 | 7 |
| 1 | 5 | 2 |
| 1 | 3 | 4 | 5 | 2 | 9 |
| 6 | 7 |
| 1 | 3 | 6 | 4 | 5 | 7 |
| 2 | 9 |
| 1 | 2 | 3 | 6 | 9 |
| 4 | 5 | 7 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 |
| 3 | 4 | 5 | 2 | 9 | 6 |
| 3 | 255 | 5 | 255 | 2 | 255 | 6 | 255 | 255 | 255 |
| 4 | 255 | 2 | 255 | 9 | 255 |
| 3 | 4 | 255 | 2 | 5 | 255 | 6 | 9 | 255 |
| 255 | 255 |
| 3 | 4 | 255 | 2 | 5 | 255 |
| 6 | 9 | 255 |
| 3 | 4 | 6 | 9 | 255 |
| 2 | 5 | 255 |
| 2 | 3 | 4 | 5 | 6 | 9 | 255 |
type ATrier=chaîne
entité DataRec
composantes:Data: ATrier
Etat: entier
fent
tableau Fi i=1,…,3 de fichier de DataRec
fichier de ATrier: FIN, FOut
DataRec: Drec, DRec2, Bidon
entier: i, j
Procédure EclateFIn(¯FName, i) !FName=nom du fichier à trier & i = numéro du fichier le plus long!
paramètre: FName: chaîne
i: entier
tableau Ni i=1,2 de entier
tableau Fi i=1,2 de fichier de DataRec
fichier de ATrier: FIn
D: ATrier
DataRec: Drec
entier: Cpt, k
F1 ß "F1.TMP"
ouvrir F1
F2 ß "F2.TMP"
ouvrir F2
FIn ß FName
ouvrir FIn
lire D sur FIn
Cpt ß 0
i ß 1
N1 ß 0
N2 ß 0
tant que NOT EOF(FIn) faire
Data de DRec ß D
Etat de DRec ß 1
si Cpt³N1+i mod 2 alors i ß 1+i mod 2 !on a un nombre de records égal à un nombre de Fibonacci!
Cpt ß 0
fsi
écrire DRec sur Fi
écrire Bidon sur Fi
Cpt ß Cpt+1
Ni ß Ni+1
lire D sur FIn
ftant
pour k de Cpt+1 à N1+i mod 2 faire !on complète avec des 'bidon' pour arriver à un nombre de Fibonacci!
écrire Bidon sur Fi
Ni ß Ni+1
fpour
si N1 < N2 alors i ß 2
sinon i ß 1
fsi
fermer FIn, F1, F2
fproc
fonction AutreF(i) !F1 et F3 sont utilisés successivement alors que F2 contient tjrs le reste du fichier!
paramètre: i: entier
à valeur entier
entier: Tmp
si i=1 alors Tmp ß 3
sinon Tmp ß 1
fsi
résultat(Tmp)
fonction PlusPetit(D1,D2) !on réinvente l'ordre pour des entités!
paramètres: D1,D2: DataRec
à valeur: booléen
booléen: Tmp
Tmp ß (Etat de D1<Etat de D2) ou ((Etat de D1=Etat de D2) et (Data de D1<Data de D2))
résultat(Tmp)
Etat de Bidonß 2 !un 'bidon' est caractérisé par un état à 2. Tt élément valable a son état à 1!
écrire "Nom du fichier à trier:"
lire FName
EclateFIn(FName,i)
si i=1 alors F1 ß "F1.TMP" !F1 correspond tjrs au + long fichier!
F2 ß "F2.TMP"
sinon F1 ß "F2.TMP"
F2 ß "F1.TMP"
fsi
F3 ß "F3.TMP"
N2 ß 1
i ß 1
tant que NOT (N2=0) faire !qd il n'y a plus d'élément en surplus, c'est que ts les éléments se trouvent dans le fichier trié!
ouvrir Fi !Fi est le fichier qui est fusionné avec F2!
lire DRec sur Fi
ouvrir F2
lire DRec2 sur F2j
ß Autre(i)
ouvrir Fj !Fj est le fichier qui reçoit la fusion!
tant que NOT EOF(F2) faire !F2 est toujours le plus petit fichier!
tant que NOT ((Etat de DRec=2) et (Etat de DRec2=2)) faire !on arrête la fusion de paquets qd les entités lues sont 'bidon'!
si PlusPetit(DRec, DRec2) alors écrire DRec sur Fj
lire DRec sur Fi
sinon écrire DRec2 sur Fj
lire DRec2 sur F2
fsi
ftant
écrire Bidon sur Fj
ftant
rebobiner F2 !on réouvre F2 pour y recopier les éléments restants de Fi!
N2 ß 0
lire DRec sur Fi
tant que NOT EOF(Fi) faire !comme F2 est toujours le plus petit fichier, il reçoit le reste inutilisé de l'autre fichier!
écrire DRec sur F2
N2 ß N2+1
lire DRec sur Fi
ftant
i ß j
ftant
fermer Fi
fermer FAutreF(i) !le tri est fini!
ouvrir Fi !on nettoie le fichier d'entités pour récupérer les ATrier!
FOut ß "TRI.DAT"
ouvrir FOut
lire DRec sur Fi
tant que NOT EOF(Fi) faire
si Etat de DRec=1 alors écrire Data de DRec sur FOut
fsi
lire DRec sur Fi
ftant
fermer Fi
fermer FOut