2f54c7de00
git-svn-id: svn://kolibrios.org@8097 a494cfbc-eb01-0410-851d-a64ba20cac60
101 lines
1.8 KiB
Plaintext
101 lines
1.8 KiB
Plaintext
(*
|
|
adapted to Oberon-07 by 0CodErr, KolibriOS team
|
|
*)
|
|
(* ********* Zonnon online collection ***********
|
|
* Sorting: Heap Sort (Chapter 2, Example 2.8)
|
|
*
|
|
* This example is a part of Prof. Nikalus Wirth's book
|
|
* www.zonnon.ethz.ch/usergroup
|
|
* (c) ETH Zurich
|
|
*)
|
|
|
|
MODULE HeapSort;
|
|
|
|
IMPORT In, Out, Console;
|
|
|
|
|
|
CONST
|
|
MAX_SIZE = 20;
|
|
|
|
|
|
TYPE
|
|
DefaultArray = ARRAY MAX_SIZE OF INTEGER;
|
|
|
|
|
|
VAR
|
|
MyArray: DefaultArray;
|
|
|
|
(***** Implementation *****)
|
|
|
|
PROCEDURE sift(VAR a: DefaultArray; L,R:INTEGER);
|
|
VAR
|
|
i, j, x: INTEGER;
|
|
|
|
BEGIN
|
|
i := L; j:= 2 * L; x:= a[L];
|
|
IF (j < R) & (a[j] < a[j + 1]) THEN j := j + 1 END;
|
|
WHILE (j <= R) & (x < a[j]) DO
|
|
a[i] := a[j]; i := j; j := 2 * j;
|
|
IF (j < R) & (a[j] < a[j + 1]) THEN j := j + 1 END
|
|
END;
|
|
a[i] := x
|
|
END sift;
|
|
|
|
|
|
PROCEDURE HeapSort(VAR a: DefaultArray; n: INTEGER);
|
|
VAR
|
|
L, R, x: INTEGER;
|
|
|
|
BEGIN
|
|
L := (n DIV 2); R := n - 1;
|
|
WHILE L > 0 DO L := L - 1; sift(a, L, R) END;
|
|
WHILE R > 0 DO
|
|
x := a[0]; a[0] := a[R]; a[R]:= x;
|
|
R := R - 1; sift(a, L, R)
|
|
END
|
|
END HeapSort;
|
|
|
|
(***** Example support *****)
|
|
|
|
PROCEDURE FillTheArray;
|
|
VAR
|
|
i: INTEGER;
|
|
|
|
BEGIN
|
|
FOR i := 0 TO MAX_SIZE - 1 DO
|
|
MyArray[i] := ABS(10 - i)
|
|
END
|
|
END FillTheArray;
|
|
|
|
|
|
PROCEDURE PrintTheArray;
|
|
VAR
|
|
i: INTEGER;
|
|
|
|
BEGIN
|
|
Out.String("Array:"); Out.Ln;
|
|
FOR i := 0 TO MAX_SIZE - 1 DO
|
|
Out.Int(MyArray[i], 2); Out.String(", ")
|
|
END;
|
|
Out.Ln
|
|
END PrintTheArray;
|
|
|
|
|
|
PROCEDURE Execute;
|
|
BEGIN
|
|
HeapSort(MyArray, MAX_SIZE)
|
|
END Execute;
|
|
|
|
|
|
BEGIN
|
|
Console.open;
|
|
|
|
Out.String("Example 2.8 (Heap sort)"); Out.Ln;
|
|
FillTheArray;
|
|
PrintTheArray;
|
|
Execute;
|
|
PrintTheArray;
|
|
Out.String("Press Enter to continue"); In.Ln;
|
|
|
|
Console.exit(TRUE)
|
|
END HeapSort. |