program bubbleSort;
{$mode objfpc}
uses sysutils,epiktimer,etpackage;
const N = 1000; {Limite supérieure de tableau}
type TTab = array of integer; { TTab : Type Tableau }
var TabSrc,TabTest : TTab ;
generic procedure swap<T>(var a, b: T);
var temp: T;
begin
temp := a; a := b; b := temp;
end;
generic procedure recursiveBubbleSort<T>(var arr:array of T;n:integer);
var
i:integer; chg: boolean = false;
begin
if (n = 1) then exit;
for i:=0 to n-2 do if (arr[i] > arr[i+1]) then begin
specialize swap<T>(arr[i], arr[i+1]); chg := true;
end;
if chg then specialize recursiveBubbleSort<T>(arr, n-1);
end;
procedure IterativeBubbleSort(var list: TTab;n:integer);
var
i, j: integer;
t: integer; chg: boolean = true;
begin
{for} i := n - 1; {downto} while (i >= 1) and chg do
begin chg := false;
for j := 0 to i - 1 do
if list[j] > list[j + 1] then
begin
t := list[j];
list[j] := list[j + 1];
list[j + 1] := t; chg := true;
end;
dec(i);
end;
end;
procedure Fill(var Tab:TTab) ;
var i : integer; { i : Indice de tableau de N colonnes }
begin
Randomize;
for i := 0 to N-1 do
tab[i]:=random(N+1);
end;
procedure Display(Tab:TTab) ;
{ Affichage des N nombres dans les colonnes }
var i : integer;
begin
writeln('_____________________________________________________');
for i:= 0 to N-1 do
write(Tab[i] : 3, ' | ');writeln;
writeln('_____________________________________________________');
End;
var cStart, cStop: Cardinal;
ET: TEpikTimer;
ResIterative, ResRecursive: Extended;
begin
ET := TEpikTimer.Create(nil);
ET.Clear;
setLength(TabSrc,N);
Fill(TabSrc);
TabTest := Copy(TabSrc,0,N);
writeln;
writeln('Unsorted Array');
Display(TabTest);
ET.Start;
specialize recursiveBubbleSort<integer>(TabTest,n);
ET.Stop;
ResRecursive := ET.elapsed;
writeln;
writeln('Sorted Array with Recursive BubbleSort');
Display(TabTest);
TabTest := Copy(TabSrc,0,N);
ET.Clear;
ET.Start;
iterativeBubbleSort(TabTest,n);
ET.Stop;
ResIterative := ET.elapsed;
writeln;
writeln('Sorted Array with Iterative BubbleSort');
Display(TabTest);
Writeln('Recursive BubbleSort time : ' + FloatToStr(ResRecursive));
Writeln('Iterative BubbleSort time : ' + FloatToStr(ResIterative));
ET.Free;
readln;
end.