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

    {
    IAN LIN

    My pride and joy, this baby sorts FAST! This is For anyone who wants an
    example of code For sorting linked lists.
    }

    {$A+,B-,D+,E-,F-,G+,I-,L+,N-,O-,R-,S+,V-,X-}
    {$M 4096,0,655360}

    Procedure Theend; {could you think of a better name???}
    begin
      Writeln('Assassin Technologies, NetRunner.');
      {members: Ian Lin, Martin Young, William Parslow, Scott Rogers; just a new
       Programming group, that's all.}
      halt; {duh, kinda obvious you need to end the Program. :) }
    end;

    Type
      prec  = ^rec;
      dType = String[96]; {put what you want here, it's fast anyhow}
      rec   = Record
        d : dType;
        n : prec;       {"next" field"}
     end;

    Var
      max, c : Word;    {maximum # of elements; Counter}
      list,
      list2,
      node,
      node2  : prec;    {first and second lists, temporary Pointers to nodes in the lists}
      ram    : Pointer; {save heap state For use With mark/release}

    begin
      max := memavail div sizeof(dType); {this takes too long but is THE maximum}
      max := 675;          {I picked this at random--it sorts in 2 seconds or so}
      Exitproc := @Theend; {just to be fancy}
      randomize;
      mark(ram);
      new(list);           {create list}
      list^.d := Char(random(10) + 48); {put something in it}
      node := list;
      For c := 2 to max do
      begin
        new(node^.n);
        node := node^.n;
        node^.n := nil;
        node^.d := Char(random(10) + 48);
      end;

      new(list2);         {begin NEW sorted list}
      list2^.n := list;   {steal the first node of list For list2}
      list := list^.n;
      list2^.n^.n := nil;
      While list <> nil do
      begin               {now steal 'em all and add them in order}
        node  := list;    {point node to first node in LIST}
        list  := list^.n; {advance LIST Pointer one node, first node is now seperate}
        node2 := list2;   {ready to use NODE2 to find the correct entry point}
        While (node2^.n <> nil) and (node^.d > node2^.n^.d) do
          node2 := node2^.n; {advance NODE2 as needed Until it marks the
                              right place For NODE to be inserted}
        node^.n  := node2^.n;{insert NODE into the new list, in the correct order}
        node2^.n := node;    {connect node to the previous nodes in new list, if any}
      end;
      list := list2^.n;      {point LIST back to the top of the list, now in order}

      node := list;          {the rest is just to display it}
      Write('List: ');
      While node <> nil do
      begin                  {as usual (at least With me), NIL is the end}
        Write(node^.d);
        node := node^.n;
      end;
      Writeln;
      release(ram);          {give all heap RAM back}
    end.

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