[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]