簡體   English   中英

如何在Delphi中使用穩定排序替換StringList.Sort?

[英]How Can I Replace StringList.Sort with a Stable Sort in Delphi?

我正在做一個簡單的StringList.sort,但是Delphi使用的QuickSort不是一個穩定的排序,這意味着它可能會改變具有相同鍵的記錄的相對順序。

我需要使用穩定的排序。 對我來說,實現這個最簡單的方法是什么?


Mike W的答案可能是最簡單的方法,無需進行太多的代碼更改。

謝謝,邁克。

如果您尚未使用字符串列表的Objects屬性,則快速而骯臟的解決方案是將對象屬性中的原始位置存儲為整數。 然后,您可以提供自己的穩定排序比較功能,該功能將原始位置考慮在內。 您在自己的代碼中所要做的就是在調用CustomSort之前迭代整個列表分配objects屬性:

function StableSortCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  result := CompareStr(List[Index1], List[Index2]);
  if result = 0 then result := integer(List.Objects[Index1]) - integer(List.Objects[Index2]);
end;

procedure TSortTestForm.SortButtonClick(Sender: TObject);
var
  SL : TStringList;
  i : integer;
begin
  SL := TStringList.Create;
  try
    SL.AddObject('One', pointer(0));
    SL.AddObject('One', pointer(1));
    SL.AddObject('One', pointer(2));
    SL.AddObject('Two', pointer(3));
    SL.AddObject('Two', pointer(4));
    SL.AddObject('One', pointer(5));
    SL.AddObject('One', pointer(6));
    SL.AddObject('One', pointer(7));
    // SL.Sort; // Try instead of custom sort to see difference
    SL.CustomSort(StableSortCompare);
    for i := 0 to SL.Count-1 do begin
      Memo1.Lines.Add(Format('Text: %s Orig Pos: %d', [SL[i], integer(SL.Objects[i])]));
    end;
  finally
    SL.Free;
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM