如何在指针的双链表上实现快速排序?

How to implement quicksort on a double-linked list of pointers?

我有对指针数组进行快速排序的代码(如果对任何人有帮助的话)但是我如何对指针的双链表进行排序?

procedure TSuperList.Sort;
begin
 if Assigned(FOnCompare) and (Length(Items)>1) then
  QuickSort(0,High(Items));
end;

procedure TSuperList.QuickSort(L,R:Integer);
var I,J: Integer;
    P,T: Pointer;
begin
  repeat
    I:=L;
    J:=R;
    P:=Items[(L+R) shr 1];
    repeat
      while FOnCompare(self,Items[I],P) < 0 do Inc(I);
      while FOnCompare(self,Items[J],P) > 0 do Dec(J);
      if I <= J then begin
        if I <> J then begin
          T:=Items[I]; Items[I]:=Items[J]; Items[J]:=T;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then QuickSort(L,J);
    L:=I;
  until I >= R;
end;

当您可以使用 O(1) 随机访问时,Quicksort 是一个不错的选择。否则这不是一个好的选择。

你当然可以用你的双向链表实现快速排序。只是任何时候你需要随机访问一个元素,你都需要遍历你的列表。显然,这会破坏性能。许多快速排序算法不需要随机访问。由 IncDec 语句举例说明的那些算法部分对于列表来说是微不足道的。但问题是支点的选择。在你上面的代码中是这一行:

P:=Items[(L+R) shr 1];

虽然您可以清楚地为列表实现它,但效率很低。

对于链表,搜索算法的有效选择是Mergesort。该维基百科页面的摘录说:

Merge sort is often the best choice for sorting a linked list: in this situation it is relatively easy to implement a merge sort in such a way that it requires only Θ(1) extra space, and the slow random-access performance of a linked list makes some other algorithms (such as quicksort) perform poorly, and others (such as heapsort) completely impossible.