{ This unit will sort ANY type of data into ANY type of order. As an added bonus, there are a routine to search through a sorted list of ANY type... Credits go to Bj”rn Felten for his QSort unit, which inspired me to write this routine } Unit SortSrch; interface Type CompFunc = Function(Item1, Item2: Integer): Integer; SwapProc = Procedure(Item1, Item2: Integer); CompOneFunc = Function(Item: Integer): Integer; Procedure QuickSort(First, Last: Integer; Comp: CompFunc; Swap: SwapProc); Function BinarySearch(First, Last: Integer; CompOne: CompOneFunc): Integer; implementation Procedure Partition(First, Last: Integer; Var SplitIndex: Integer; Comp: CompFunc; Swap: SwapProc); Var Up, Down, Middle: Integer; Begin Middle := ((Last - First) DIV 2 ) + First; Up := First; Down := Last; Repeat While (Comp(Up, Middle) <= 0) And (Up < Last) Do Inc(Up); While (Comp(Down, Middle) > 0) And (Down > First) Do Dec(Down); If Up < Down Then Swap(Up, Down); Until Up >= Down; SplitIndex := Down; Swap(Middle, SplitIndex); End; Procedure QuickSort(First, Last: Integer; Comp: CompFunc; Swap: SwapProc); Var SplitIndex: Integer; Begin If First < Last Then Begin Partition(First, Last, SplitIndex, Comp, Swap); QuickSort(First, SplitIndex - 1, Comp, Swap); QuickSort(SplitIndex + 1, Last, Comp, Swap); End; End; Function BinarySearch(First, Last: Integer; CompOne: CompOneFunc): Integer; Var Middle, Jfr: Integer; Begin Repeat Middle := ((Last - First) DIV 2 ) + First; Jfr := CompOne(Middle); If Jfr = 0 Then Begin BinarySearch := Middle; Exit; End Else If Jfr > 0 Then First := Middle Else Last := Middle; Until First = Last; BinarySearch := -1; End; end.