program kasalajittelu;

uses TRA;

function elementtoprio(x : ELEMENT) : real;
begin
	elementtoprio := ELEMENT_INT(x);
end;

procedure heapsort(L : LIST);
	var	A : PRIQUEUE;
begin
	PRIQUEUE_CREATE(A, LIST_TYPE(L));
	while (LIST_FIRST(L) <> LIST_EOL(L)) do begin
		PRIQUEUE_INSERT(A, LIST_RETRIEVE(L, LIST_FIRST(L)), 
				elementtoprio(LIST_RETRIEVE(L, LIST_FIRST(L))));
		LIST_DELETE(L, LIST_FIRST(L))
		end;
	while not PRIQUEUE_EMPTY(A) do begin
		LIST_INSERT(L, LIST_EOL(L), PRIQUEUE_MIN(A));
		PRIQUEUE_DELETEMIN(A);
		end;
	PRIQUEUE_FREE(A);
end;

(* kokeellinen osa *)

const N = 30;
const M = 100;

var L : LIST;
	i, s : integer;

begin

	INT_LIST_CREATE(L);

	writeln('Listaan : ');
	for i := 1 to N do  begin
		s := random(M);
		write(s);
		write(' ');
		INT_LIST_INSERT(L, LIST_EOL(L), s);
	end;
	writeln;

	heapsort(L);

	writeln('Lajiteltuna');
	LIST_PRINT(L);
	writeln;

	LIST_FREE(L);

end.
