HeapSort.ob07 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. (*
  2. adapted to Oberon-07 by 0CodErr, KolibriOS team
  3. *)
  4. (* ********* Zonnon online collection ***********
  5. * Sorting: Heap Sort (Chapter 2, Example 2.8)
  6. *
  7. * This example is a part of Prof. Nikalus Wirth's book
  8. * www.zonnon.ethz.ch/usergroup
  9. * (c) ETH Zurich
  10. *)
  11. MODULE HeapSort;
  12. IMPORT In, Out, Console;
  13. CONST
  14. MAX_SIZE = 20;
  15. TYPE
  16. DefaultArray = ARRAY MAX_SIZE OF INTEGER;
  17. VAR
  18. MyArray: DefaultArray;
  19. (***** Implementation *****)
  20. PROCEDURE sift(VAR a: DefaultArray; L,R:INTEGER);
  21. VAR
  22. i, j, x: INTEGER;
  23. BEGIN
  24. i := L; j:= 2 * L; x:= a[L];
  25. IF (j < R) & (a[j] < a[j + 1]) THEN j := j + 1 END;
  26. WHILE (j <= R) & (x < a[j]) DO
  27. a[i] := a[j]; i := j; j := 2 * j;
  28. IF (j < R) & (a[j] < a[j + 1]) THEN j := j + 1 END
  29. END;
  30. a[i] := x
  31. END sift;
  32. PROCEDURE HeapSort(VAR a: DefaultArray; n: INTEGER);
  33. VAR
  34. L, R, x: INTEGER;
  35. BEGIN
  36. L := (n DIV 2); R := n - 1;
  37. WHILE L > 0 DO L := L - 1; sift(a, L, R) END;
  38. WHILE R > 0 DO
  39. x := a[0]; a[0] := a[R]; a[R]:= x;
  40. R := R - 1; sift(a, L, R)
  41. END
  42. END HeapSort;
  43. (***** Example support *****)
  44. PROCEDURE FillTheArray;
  45. VAR
  46. i: INTEGER;
  47. BEGIN
  48. FOR i := 0 TO MAX_SIZE - 1 DO
  49. MyArray[i] := ABS(10 - i)
  50. END
  51. END FillTheArray;
  52. PROCEDURE PrintTheArray;
  53. VAR
  54. i: INTEGER;
  55. BEGIN
  56. Out.String("Array:"); Out.Ln;
  57. FOR i := 0 TO MAX_SIZE - 1 DO
  58. Out.Int(MyArray[i], 2); Out.String(", ")
  59. END;
  60. Out.Ln
  61. END PrintTheArray;
  62. PROCEDURE Execute;
  63. BEGIN
  64. HeapSort(MyArray, MAX_SIZE)
  65. END Execute;
  66. BEGIN
  67. Console.open;
  68. Out.String("Example 2.8 (Heap sort)"); Out.Ln;
  69. FillTheArray;
  70. PrintTheArray;
  71. Execute;
  72. PrintTheArray;
  73. Out.String("Press Enter to continue"); In.Ln;
  74. Console.exit(TRUE)
  75. END HeapSort.