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.
|