Back to lecture notes -- Keyboard shortcut: 'u'              Lecture 6 - slide 18 : 46
 

Program sortering;
uses dos, crt;

Const Max = 30000;

Type TabelInterval = 1 .. Max;
     TabelElement = Integer;
     ArrayType = array[TabelInterval] of TabelElement;

Var T: ArrayType;
    starttid, sluttid, laengde: Longint;

Procedure Initialiser(var T: ArrayType);
(* Tilskriv startværdier af tabellen T *)
var i: integer;
begin
  Randomize;
  for i := 1 to max do T[i] := Random(10000);
end; (* Initialiser *)

procedure Udskriv(var T: ArrayType; fra, til: TabelInterval);
var i: TabelInterval;
begin
  writeln;
  for i := fra to til do
  begin
    write(T[i]:5);
  end;
  writeln
end; (* udskriv *)

procedure Sorter(var T: ArrayType; n: integer);
(* Sorter de førte n elementer i T i stigende orden.
   Sorteringen foregår ved at bytte om på elementerne i T *)
var i,m: TabelInterval;

  function FindMaxIndex(var T: ArrayType;
                        fra, til: TabelInterval): TabelInterval;
  (* Find elementet med den største værdi i T[fra..til],
     og returner dets indeks *)
  (* PREBETINGELSE: 1 <= fra <= til <= max *)
  var i, MaxIndex: TabelInterval;
      MaxElement: TabelElement;
  begin
    MaxIndex := fra; MaxElement := T[fra];
    for i := fra+1 to til do
    if T[i] > MaxElement
    then begin
           MaxElement := T[i];
           MaxIndex := i
         end;
    FindMaxIndex := MaxIndex
  (* POSTBETINGELSE: For alle j: T[j].Fornavn <= T[MaxIndex].Fornavn *)
  end; (* FindMaxIndex *)

  procedure Ombyt(var T: ArrayType; i,j: TabelInterval);
  (* Ombyt element i og j i T *)
  var temp: TabelElement;
  begin
    temp := T[i];
    T[i] := T[j];
    T[j] := temp
  end; (* Ombyt *)

begin (* sorter *)
  for i := n downto 2 do
  begin
    m := FindMaxIndex(T,1,i);
    (* Invariant: T[i+1..max] er sorteret i stigende orden.
                  T[1..i] <= T[i+1..max]. *)
    Ombyt(T,i,m);
  end
(* POSTBETINGELSE: T[1] <= T[2] <= ... <= T[max] *)
end; (* Sorter *)

Function time: LongInt;
(* Returner antal hundrede-dele sekunder siden
   sidste midnat *)
var t,m,s,h: Word;
begin
  GetTime(t,m,s,h);
  time := Longint(h) +
           100 * (longint(s) +
              60 * (longint(m) +
                 60 * longint(t)));
end;

function KoeretidsKvotient(koeretid, n: LongInt): Real;
(* n er problemstørrelse. Koeretid angiver det målte tidsforbrug.
Returner en normaliseret kvotient af den teoretisk estimerede køretid
og den faktiske køretid i mikrosekunder *)
var teoretiskTid, microtid: Longint;
begin
  microtid := koeretid * 10000;
  teoretiskTid := n * n + n div 2;
  KoeretidsKvotient := teoretiskTid / microtid;
end;

begin (* hovedprogram *)
  Clrscr; laengde := 4000;
  while laengde < 30000
  do begin
       Initialiser(T);
       starttid := time;
       Sorter(T,laengde);
       sluttid := time;
       writeln(laengde,' elementer. Tidsforbrug, 100-dele sek.:',
               sluttid-starttid);
       writeln('Køretidskvotient for sortering af ', laengde,
                ' elementer: ',
                koeretidsKvotient(sluttid-starttid, laengde):9:3);
       (* Udskriv(T,1,max); *)
       writeln;
       laengde := laengde + 4000;
     end;
  writeln('SLUT'); readkey;
end.