unit Sorting; {=============================================} { James L. Allison } { 1703 Neptune Lane } { Houston, Texas 77062 } { Dec 22, 1988 } {=============================================} { Please feel free to use any part of this in any of your programs.} interface uses TypeSpec; type Item=TypeSpec.Character; {This defines the objects being sorted.} List=array [0..0] of Item; {This is an array of objects to be sorted.} L_Less_Than_R = function(L,R:Item):boolean; { This is a user defined function that determines the order of the sort. It may be as simple or complex as necessary to give the desired order. In particular it can use any field in a record as the sort key, or use more than one key. } { Make sure that range check is off before you use any of these. } procedure QuickSort (var X:List; Less_Than:L_Less_Than_R; N:integer); { A very fast sort, uses recursion. May have stack problems on a large sort. } procedure ShellSort (var X:List; Less_Than:L_Less_Than_R; N:integer); { Almost as fast as QuickSort, but without recursion. The work horse of fast sorting methods. } procedure LoopSort (var X:List; Less_Than:L_Less_Than_R; N:integer); { No reason to use this. Included only for comparison. } procedure BubbleSort (var X:List; Less_Than:L_Less_Than_R; N:integer); { The only time to use this is when the array is almost in order, with only a couple of items out of place. It may be useful to modify this to make the sweep from the other end of the array. BubbleSort is a special purpose method. Stick to QuickSort or ShellSort.} (*---------------------------------------------------------------------*) implementation (*---------------------------------------------------------------------*) procedure Swap(var X:List;I,J:integer); var Temp:Item; begin Temp:=X[I]; X[I]:=X[J]; X[J]:=Temp; end; (*---------------------------------------------------------------------*) procedure Qsort(var X:List;Less_Than:L_Less_Than_R;Left,Right:integer); label Again; var Pivot:Item; P,Q:integer; begin P:=Left; Q:=Right; Pivot:=X [(Left+Right) div 2]; while P<=Q do begin while Less_Than(X[P],Pivot) do inc(P); while Less_Than(Pivot,X[Q]) do dec(Q); if P>Q then goto Again; Swap(X,P,Q); inc(P);dec(Q); end; Again: if Left0 do begin I:=Gap; while I=0) and (Less_Than(X[J+Gap],X[J])) do begin Swap(X,J,J+Gap); dec(J,Gap); end; inc(I); end; Gap:=Gap div 2; end; end; (*---------------------------------------------------------------------*) procedure LoopSort(var X:List;Less_Than:L_Less_Than_R;N:integer); var I,J:integer; begin for I:=0 to N-1 do begin for J:=I+1 to N-1 do begin if Less_Than(X[J],X[I]) then begin Swap(X,I,J); end; end; end; end; (*---------------------------------------------------------------------*) procedure BubbleSort(var X:List;Less_Than:L_Less_Than_R;N:integer); var J:integer; Finished:boolean; begin repeat Finished:=true; for J:=0 to N-2 do if Less_Than(X[J+1],X[J]) then begin Finished:=false; Swap(X,J,J+1); end; dec(N); until Finished; end; begin end.