[Back to SORTING SWAG index] [Back to Main SWAG index] [Original]
{ 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.
[Back to SORTING SWAG index] [Back to Main SWAG index] [Original]