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

{
>         Now, I gotta work on sortin' em.  I believe I can 'swap' the
>         positions of the Pointers eh?
>
>         I can't figure out how to swap the Pointers.  Could you please
>         gimme a wee bit more help?  I've just started doing sorts, and
>         have only used the Bubble sort at the moment in a few Programs,
>         so I'm still a little shakey on sorts.  I understand the Bubble

  Here's an *example* on how to sort a linked list. There are more
  efficient ways to sort a list, but this gives you all the
  essential elements in doing a sort. (note that ListPtr is a doubly
  linked list)
}

Procedure SortList(Var FCL:ListPtr);
Var
  TempAnchor, TemPtr1, TemPtr2 :ListPtr;

  Procedure MoveLink(Var Anchor, Ptr1, Ptr2 :ListPtr);
  Var
    TemPtr3, TemPtr4 :ListPtr;
  begin
    TemPtr3 := Ptr1^.Next;   { temporary Pointer preserves old
                               Pointer value }
    TemPtr4 := Ptr2^.Last;   { ditto }

    Ptr2^.Last := Ptr1;          { do the Pointer swap }
    Ptr1^.Next := Ptr2;

    Ptr1^.Last^.Next := TemPtr3; { fixup secondary Pointers }
    TemPtr3^.Last := Ptr1^.Last;
    Ptr1^.Last := TemPtr4;

    if TemPtr4 <> NIL then       { if temporary Pointer is not
                                   NIL, then it has to point to
                                   swapped Pointer }
       TemPtr4^.Next := Ptr1;

    if Ptr1^.Last = NIL then     { if swapped Pointer points to
                                   preceding NIL Pointer, this
                                   Pointer is the new root. }
       Anchor := Ptr1;
  end;

begin
  TempAnchor := FCL;     { holds root of list during sort }
  TemPtr2 := TempAnchor; { TemPtr2 points to current data being
                           Compared }
  Repeat
    TemPtr1 := TemPtr2; { TemPtr1 points to the next ordered
                          data }
    FCL := TemPtr2;     { start FCL at root of UNSorTED list -
                          sorted data precede this Pointer }
    Repeat
      FCL := FCL^.Next;
      if FCL^.data < TemPtr1^.data then   { Compare data values }
        TemPtr1 := FCL;         { if necessary, reset TemPtr1 to
                                   point to the new ordered value }
    Until FCL^.Next = NIL;        { keep going Until you reach the
                                    end of the list. After Exit,
                                    the next value in order will be
                                    pointed to by TemPtr1 }
    if TemPtr1<>TemPtr2 then      { if TemPtr1 changed, a value
                                    was found out of order }
      MoveLink(TempAnchor,TemPtr1,TemPtr2) { then swap Pointers }
    else
      TemPtr2 := TemPtr2^.Next;  { else advance to the next
                                    Pointer in list }
  Until TemPtr2^.Next = NIL;      { Until we are finished sorting
                                     the list }
  FCL := TempAnchor;    { changes root Pointer to new root value }
end;


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