【问题标题】:How to implement quicksort on a double-linked list of pointers?如何在指针的双链表上实现快速排序?
【发布时间】:2015-07-16 12:38:55
【问题描述】:

我有快速排序指针数组的代码(如果对任何人有帮助的话),但我如何为指针的双链表做到这一点?

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;

【问题讨论】:

    标签: delphi pointers quicksort delphi-2009


    【解决方案1】:

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

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

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

    虽然您可以清楚地为列表实现这一点,但效率低下。

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

    合并排序通常是对链表进行排序的最佳选择:在这种情况下,实现合并排序相对容易,它只需要 Θ(1) 额外空间,而且随机访问性能很慢链表的排序使得其他一些算法(如快速排序)表现不佳,而其他算法(如堆排序)则完全不可能。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2022-01-17
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多