max_vals%=1000 count%=0 DIM values%(max_vals%) REM --------------------------------------------------------------------------- REM Main program REM Purpose: load the configured file, sort its values, save the result, report time. REM Parameters: None. Returns: no value. REM Variables used: values%, count%, elapsed! and the called procedure state. REM --------------------------------------------------------------------------- PRINT "***HEAPSORT GFA BASIC***" load_input_file("INPUT.TXT") elapsed!=@heap_sort save_output_file("OUTPUT.TXT") PRINT "***RUN COMPLETE***" PRINT "HEAPSORT TOOK ";elapsed!;" SECONDS." REM --------------------------------------------------------------------------- REM save_output_file REM Purpose: write values%(0..count%-1), one value per line. REM Parameters: file_spec$ - output file path. REM Returns: no value. REM Variables used: v% - array traversal index; #1 - output file channel. REM --------------------------------------------------------------------------- PROCEDURE save_output_file(file_spec$) PRINT "SAVING OUTPUT FILE..."; OPEN "o",#1,file_spec$ FOR v%=0 TO count%-1 PRINT #1,STR$(values%(v%)) NEXT v% CLOSE #1 PRINT "DONE." RETURN REM --------------------------------------------------------------------------- REM load_input_file REM Purpose: read integer lines into values% and update count%. REM Parameters: file_spec$ - input file path. REM Returns: no value. REM Variables used: line$ - current line; count% - number of values loaded. REM --------------------------------------------------------------------------- PROCEDURE load_input_file(file_spec$) PRINT "LOADING INPUT FILE..."; DIM line$(80) count%=0 OPEN "i",#1,file_spec$ DO WHILE NOT EOF(#1) INPUT #1,line$ IF line$<>"" THEN values%(count%)=VAL(line$) count%=count%+1 ENDIF LOOP CLOSE #1 PRINT "DONE." RETURN REM --------------------------------------------------------------------------- REM sift_down REM Purpose: restore the max-heap property below root% in values%. REM Parameters: root% - zero-based root; last% - exclusive heap end. REM Returns: no value; mutates values%. REM Variables used: child%, temp% - child index and swap storage. REM --------------------------------------------------------------------------- PROCEDURE sift_down(root%,last%) DO WHILE 2*root%+1=values%(child%) temp%=values%(root%) values%(root%)=values%(child%) values%(child%)=temp% root%=child% LOOP RETURN REM --------------------------------------------------------------------------- REM heap_sort REM Purpose: sort values% in place and measure elapsed time. REM Parameters: None; uses global values% and count%. REM Returns: elapsed duration in seconds. REM Variables used: start%, end%, temp% - heap state; start_time!, end_time! - ticks. REM --------------------------------------------------------------------------- FUNCTION heap_sort PRINT "SORTING ELEMENTS..."; start_time!=TIMER FOR start%=count%/2-1 TO 0 STEP -1 sift_down(start%,count%) NEXT start% FOR end%=count%-1 TO 1 STEP -1 temp%=values%(0) values%(0)=values%(end%) values%(end%)=temp% sift_down(0,end%) NEXT end% end_time!=TIMER PRINT "DONE." RETURN (end_time!-start_time!)/200 ENDFUNC