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