Sorting an array of integers

From: Bob Richardson (bobrNO_at_SPAMhidbey.com)
Date: 03/22/04


Date: Sun, 21 Mar 2004 22:25:26 -0800

I'd like to be able to have a generic procedure to sort an array of
integers - ideally:
  ArraySort(MyArray,Max); for ascending, and
  ArraySort(MyArray,Max,false); for descending.

When I trace to this procedure, my "watch list" looks good, with the correct
results in
tArray(P^)[i]

However, I get an exception error when I try to look at the above item.

Here's where I am:

Type
  tMyCompare = Function(Const Item1, Item2:Integer):Boolean;
  tArray = array[0..10000] of integer;

procedure ArraySort(P : pointer; const Max: Integer; Up : boolean = true);

implementation

procedure ArraySort(P : pointer; const Max: Integer; Up : boolean = true);
var M,N, Gap: Integer; Compare : tMyCompare;

  function Ascend(const Item1, Item2: Integer): Boolean;
  begin
    Result := tArray(P^)[Item1] > tArray(P^)[Item2];
  end; {MyIsGreater}

  function Descend(const Item1, Item2: Integer): Boolean;
  begin
    Result := tArray(P^)[Item1] < tArray(P^)[Item2];
  end; {MyIsGreater}

  procedure MySwap(const Item1, Item2: Integer);
  var Hold: Integer;
  begin
    Hold := tArray(P^)[Item2];
    tArray(P^)[Item2] := tArray(P^)[Item1];
    tArray(P^)[Item1] := Hold;
  end; {MySwap }
begin
  Gap := (Max - 1) div 2 + 1;
  if Up then
   Compare := @Ascend
  else
   Compare := @Descend;
  while Gap > 0 do
  begin
    for M := 0 to Max - Gap do
    begin
      N := M;
      while N >= 0 do
      begin
        if Compare(N, N + Gap) then
          MySwap(N, N + Gap)
        else
          N := -1;
        N := N - Gap;
      end; {While}
    end; {For}
    Gap := Gap div 2;
  end; {While}
end; {ArraySort}