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

时间:2015-05-06 11:40:59

标签: delphi pointers quicksort delphi-2009

我有快速分配指针数组的代码(如果对任何人有帮助),但是我如何为一个doble链接指针列表做这个?

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;

1 个答案:

答案 0 :(得分:2)

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

您当然可以使用双向链表实现Quicksort。只要您需要随机访问元素,就需要逐步浏览列表。显然这会破坏性能。大多数Quicksort算法不需要随机访问。以IncDec语句为例的算法部分对于列表来说是微不足道的。但问题是枢轴选择。在上面的代码中就是这一行:

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

虽然您可以清楚地将其用于列表,但效率很低。

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

  

合并排序通常是排序链表的最佳选择:在这种情况下,以这样的方式实现合并排序相对容易,它只需要Θ(1)额外空间和慢随机访问性能一个链表使一些其他算法(如quicksort)表现不佳,而其他算法(如heapsort)完全不可能。