|
NB: Cette procédure à été écrite pour des tableaux d'entiers longs. Il suffit de changer E%() par E$() ou un autre Type pour l'adapter. D'autre part les élément sont y sont triés à partir de 1 et non de 0. Télécharger le listing de la procédure : trishell.lst. |
|
PROCEDURE trier_shell(N%, VAR E%()) LOCAL D%, LIMITE%, INTERVERSION%, J%, I% D% = DIV(N%, 2) ' Distance de comparaison DO' BOUCLE PRINCIPALE DE SUBDIVISION DES DISTANCES LIMITE% = SUB(N%, D%) ' Limite ou s'arrêtent les comparaisons DO' - BOUCLE SECONDAIRE DE RECOMPARAISON EN CAS D'INTERVESION INTERVERSION% = 0 ' A priori pas d'interversion (=0) J% = D% ' J%=numéro du 2ème élément dans les comparaisons FOR I%=1 TO LIMITE% ' - Boucle de tri avec I%=1er élément de comparaison INC J% ' J% suis I% en gardant la distance D% IF E%(I%)>E%(J%) ' Si il y a lieu d'intervertir INTERVERSION% = I% ' On mémorise l"emplacement de l'interversion SWAP E%(I%), E%(J%) ' On interverti les 2 éléments ENDIF NEXT I% LIMITE% = INTERVERSION% ' Prochaine Boucle de tri s'arrêtera à la dernière interversion LOOP WHILE INTERVERSION%>0 ' On refait des comparaisons si l'ordre des éléments a changé DIV D%, 2 ' Sinon on divise la distance par 2 et on recommence LOOP WHILE D%>0 ' sauf si plus possible de diminuer la distance RETURN |
|
Télécharger le listing demotri2.lst |
|
FULLW #1 ' Ouvrir une fenêtre en grand NE% = 1000 ' Nombre d'éléments = NE% DIM T%(NE%) ' Création d'un tabelau d'entier long ' Affectation de valeurs aléatoires et affichage AFY% = 0 FOR I%=1 TO NE% T%(I%) = INT((RND-0.5)*4294967295) IF I%<10 OR I%>SUB(NE%, 10) TEXT 0 , AFY%, "Elément "+ STR$(I%)+ " = "+ STR$(T%(I%)) ADD AFY%, 20 IF I%=9 TEXT 0 , AFY%, "..." ADD AFY%, 20 ENDIF ENDIF NEXT I% ' Tri du tableau en appelant notre procédure trier_shell NE%, T%() ' Affichage du résultat du tri AFY% = 0 FOR I%=1 TO NE% IF I%<10 OR I%>SUB(NE%, 10) TEXT 200 , AFY%, " -> "+ STR$(T%(I%)) ADD AFY%, 20 IF I%=9 TEXT 200 , AFY%, "..." ADD AFY%, 20 ENDIF ENDIF NEXT I% ' Fin du programme annoncée avec attente d'un évènement clavier TEXT 0 , AFY%, "Fin du TRI SHELL, Appuyez sur une touche." KEYGET rien% ' Attend l'appui d'une touche CLOSEW # 1 ' On ferme la fenêtre en partant. PROCEDURE trier_shell(N%, VAR E%()) LOCAL D%, LIMITE%, INTERVERSION%, J%, I% D% = DIV(N%, 2) ' Distance de comparaison DO' BOUCLE PRINCIPALE DE SUBDIVISION DES DISTANCES LIMITE% = SUB(N%, D%) ' Limite ou s'arrêtent les comparaisons DO' - BOUCLE SECONDAIRE DE RECOMPARAISON EN CAS D'INTERVESION INTERVERSION% = 0 ' A priori pas d'interversion (=0) J% = D% ' J%=numéro du 2ème élément dans les comparaisons FOR I%=1 TO LIMITE% ' - Boucle de tri avec I%=1er élément de comparaison INC J% ' J% suis I% en gardant la distance D% IF E%(I%)>E%(J%) ' Si il y a lieu d'intervertir INTERVERSION% = I% ' On mémorise l"emplacement de l'interversion SWAP E%(I%), E%(J%) ' On interverti les 2 éléments ENDIF NEXT I% LIMITE% = INTERVERSION% ' Prochaine Boucle de tri s'arrêtera à la dernière interversion LOOP WHILE INTERVERSION%>0 ' On refait des comparaisons si l'ordre des éléments a changé DIV D%, 2 ' Sinon on divise la distance par 2 et on recommence LOOP WHILE D%>0 ' sauf si plus possible de diminuer la distance RETURN |