-- Copyright (C) 1984 by Xerox Corporation. All rights reserved. -- HeapSorter.mesa, HGM, 9-Jul-84 23:28:04 DIRECTORY HeapSort USING []; HeapSorter: PROGRAM EXPORTS HeapSort = BEGIN -- Knuth vol 3 section 5.2.3 algorithm H (pg 146) Key: TYPE = UNSPECIFIED; Sort: PUBLIC PROCEDURE [ base: LONG POINTER, length: CARDINAL, less: PROCEDURE [Key, Key] RETURNS [BOOLEAN]] = BEGIN array: LONG POINTER TO ARRAY OF Key ← base; i, j, l, r: CARDINAL; key: Key; IF length <= 1 THEN RETURN; l ← length/2; r ← length - 1; DO IF l > 0 THEN BEGIN l ← l - 1; key ← array[l]; END ELSE BEGIN key ← array[r]; array[r] ← array[0]; r ← r - 1; IF r = 0 THEN BEGIN array[0] ← key; EXIT; END; END; j ← l; DO i ← j; j ← j*2 + 1; IF j > r THEN EXIT; IF j < r AND less[array[j], array[j + 1]] THEN j ← j + 1; IF ~less[key, array[j]] THEN EXIT; array[i] ← array[j]; ENDLOOP; array[i] ← key; ENDLOOP; END; LongKey: TYPE = LONG UNSPECIFIED; SortLong: PUBLIC PROCEDURE [ base: LONG POINTER, length: CARDINAL, less: PROCEDURE [LongKey, LongKey] RETURNS [BOOLEAN]] = BEGIN array: LONG POINTER TO ARRAY OF LongKey ← base; i, j, l, r: CARDINAL; key: LongKey; IF length <= 1 THEN RETURN; l ← length/2; r ← length - 1; DO IF l > 0 THEN BEGIN l ← l - 1; key ← array[l]; END ELSE BEGIN key ← array[r]; array[r] ← array[0]; r ← r - 1; IF r = 0 THEN BEGIN array[0] ← key; EXIT; END; END; j ← l; DO i ← j; j ← j*2 + 1; IF j > r THEN EXIT; IF j < r AND less[array[j], array[j + 1]] THEN j ← j + 1; IF ~less[key, array[j]] THEN EXIT; array[i] ← array[j]; ENDLOOP; array[i] ← key; ENDLOOP; END; END.