(*tri batcher*)
(*Pour accélérer la vitesse d'un tri par échange, il est nécessaire de comparer des éléments qui ne sont plus adjacents et c'est ce que proposa K.E. Batcher en 1968. En voici une description appliquée à un tableau T de N éléments numérotés de 1 à N.
Soit t, la plus petite valeur telle que 2t>=N.
Soit p la valeur 2t-1, c'est le plus grand écart exprimé sous forme de puissance de 2 qui existe entre des numéros de position d'éléments de T.
*)
PROGRAM Batcher;
USES CRT;
VAR N, i, j, p, p2, q, r, t, d : WORD;
A : ARRAY[1..10000] OF BYTE;
Fin : BOOLEAN;
echange, comparaisons : longint;
PROCEDURE Affiche;
VAR i:WORD;
BEGIN
FOR i:=1 TO N DO
WRITE (A[i]:4);
WRITELN
END;
PROCEDURE SWAP(VAR a,b:BYTE);
VAR Tmp:BYTE;
BEGIN
Tmp:=a;
a:=b;
b:=Tmp ;
echange:=echange+1;
END;
BEGIN
CLRSCR;
N:=10;
RANDOMIZE;
echange :=0;
comparaisons:=0;
FOR i:=1 TO N DO
begin
A[i]:=RANDOM(50);
A[i]:=N-i;
end;
WRITELN('Avant le tri:');
Affiche;
p:=1;
WHILE p<N DO p:=p SHL 1;
p2:=p SHR 1;
WHILE p>=2 DO
BEGIN
p:=p SHR 1;
q:=p2;
r:=0;
d:=p;
Fin:=FALSE;
WHILE NOT Fin do
BEGIN
FOR i:=0 TO N-d-1 DO
begin
IF (i AND p) =r THEN
begin
comparaisons:=comparaisons+1;
IF A[i+1]>A[i+d+1] THEN SWAP(A[i+1],A[i+d+1]);
end;
end;
IF q<>p THEN BEGIN
d:=q-p;
q:=q SHR 1;
r:=p;
Fin:=FALSE
END
ELSE Fin:=TRUE;
END;
END;
WRITELN('Apres le tri:');
Affiche;
Writeln('Echange = ',echange);
Writeln('Comparaisons = ',comparaisons);
END.
mais cette solution est valable que pour cet exemple, donc il faut généraliser
je pense de convertir ce nombre en chaine ou en tableau et d'appliquer l'une de méthodes du tri connues
debut
ecrire('donner A :');
lire(A);
ecrire('donner B :');
lire(B);
Si A<B alors Ecrire(A)
sinon Ecrire(B);
fin si;
fin.