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

    (*
     -=> Quoting Tim Benoit to All <=-

     TB> I am having a bit of difficulty figuring out how to sort an
     TB> array of records by numerical or alphabetical order.
     TB>                  I need all the information that goes with that
     TB> specific Record to stay with it...

        This example uses a modified bubblesort algorithm, not real fast but
    fairly easy to follow. You may want to use a faster sort procedure but
    the basic idea is to examine the data in your selected sort
    field (RecArray[i].variable) but do the sort on the whole
    record (RecArray[i]):

    eg:
         Var

             Buffer : Rec;

         If RecArray[3].Number1 > RecArray[4].Number1 then { sort }

            Begin   { interchange RecArray[3] and RecArray[4] }
                    Buffer := RecArray[3];
                    RecArray[3] := RecArray[4];
                    RecArray[4] := Buffer
            End;

    Bubblesort makes multiple passes moving data only one place per pass.
    This example is similar but uses only one pass.
    *)

    Program Modsort;

    uses Crt;      {only needed for clrscr}

    Const
      max = 10;      {max number of records}

    Type
      fieldtype = string[2];
      datatype = record
             rec1 : fieldtype;
             rec2 : fieldtype;
             end;
    Var
      data : array [1..max] of datatype;
      i,j : byte;

    Procedure interchange(r,l:datatype);

    Var
       buffer : datatype;

    Begin
         buffer := r;
         data[i] := l;
         data[i+1] := buffer;
         dec(i);
    End;

    Procedure sort(j : byte);  {j is the selected sort field number}

    Var
       field : array [1..2] of fieldtype;

    Begin
       i := 1;

       While i < max  do
             Begin
                Case j of
                    1 : Begin
                           field[1] := data[i].rec1;
                           field[2] := data[i+1].rec1;
                        End;
                    2 : Begin
                           field[1] := data[i].rec2;
                           field[2] := data[i+1].rec2;
                        End;
                End;

             If field[1] > field[2] then
                Interchange(data[i], data[i+1])
             Else
                Inc(i);
             End;
    End;

    Begin                              {main}

    Clrscr;
    Writeln('UNSORTED :');
    For i := 1 to max do              {make up random array of alphas}
        Begin
            j := random(26);
            data[i].rec1 := chr(j+65);
            Write(data[i].rec1);
            j := random(26);
            Data[i].rec2 := chr(j+65);
            Writeln(',',data[i].rec2);
        End;

    Write('Sort on which field? ');
    Readln(j);
    Sort(j);
    Writeln('SORTED ON FIELD: ',j);

    For i := 1 to max do
        Begin
            Write(data[i].rec1);
            Writeln(',',data[i].rec2);
        End;

    End.

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