[Back to SORTING SWAG index] [Back to Main SWAG index] [Original]

    {
     TB>> I am having a bit of difficulty figuring out how to
     TB>> sort an array of records by numerical or alphabetical order.
     TB>> Here's an example of my record set up:

            This a 'small' example of record quicksort.
    }

    Program SortArrayOfRec;

    uses  Crt;

    type

     Str34=string[34];

     Rec=Record
          Name:Str34;
          Number1,
          Number2 : LongInt;
         end;

    type CmpMinFunc=Function(var r1,r2:Rec):boolean;

    var

     RecArray:array[1..1400] of Rec;

    { Compare functions }

    Function Name(var r1,r2:Rec):boolean; far;
    begin
     Name:=r1.Name<r2.Name;
    end;

    Function Number1(var r1,r2:Rec):boolean; far;
    begin
     Number1:=r1.Number1<r2.Number1;
    end;

    Function Number2(var r1,r2:Rec):boolean; far;
    begin
     Number2:=r1.Number2<r2.Number2;
    end;

    { QuickSort method }

    Procedure Sort(t,b:integer; Cmp:CmpMinFunc);

    Procedure QuickSort(l,r:integer);
    var i,j:integer; x,y:Rec;
    begin
     i:=l;
     j:=r;
     x:=RecArray[(l+r) div 2];
     repeat
      while Cmp(RecArray[i],x) do inc(i);
      while Cmp(x,RecArray[j]) do dec(j);
      if i<=j
      then begin
            y:=RecArray[i];
            RecArray[i]:=RecArray[j];
            RecArray[j]:=y;
            inc(i);
            dec(j);
           end;
     until i>j;
     if l<j then QuickSort(l,j);
     if i<r then QuickSort(i,r);
    end;

    begin                                   { Procedure Sort }
     QuickSort(t,b);
    end;

    { Demo procedures }

    Procedure List(s:string);
    var n:byte;
    begin
     WriteLn(s);
     for n:=1 to 9 do
      with RecArray[n] do
       WriteLn(n,'     ',Name,Number1:6,Number2:6);
     WriteLn;
     n:=Ord(ReadKey);
    end;

    var   n:byte;

    begin
     ClrScr;
     Randomize;
     for n:=1 to 9 do                       { Fill RecArray with ... }
      with RecArray[n] do                   { random datas }
       begin
        Name:=Chr(65+Random(25));
        Number1:=Random(65535);
        Number2:=Random(65535);
       end;
     List('Datas');

     Sort(1,9,Name);                        { Sort on Name }
     List('Sort on Name');
     Sort(1,9,Number1);                     { Sort on Number1 }
     List('Sort on Number1');
     Sort(1,9,Number2);                     { Sort on Number2 }
     List('Sort on Number2');
    end.

[Back to SORTING SWAG index] [Back to Main SWAG index] [Original]