0

我们使用下面的代码对文件中的行进行排序。我给出了如下输入行:

6 5 1 12 10

但我得到如下:

10 12 1 5 6

我需要作为

1 5 6 10 12

有什么方法可以对 Inno Setup 中的数字行进行排序。

procedure SortList(const FileName: string);
var
  I: Integer;
  Files: TStringList;
begin
  Files := TStringList.Create;
  try
    Files.LoadFromFile(FileName);
    for I := Files.Count - 1 downto 0 do
    begin
      Files.sort;
    end;
    Files.SaveToFile(FileName);
  finally
    Files.Free;
  end;
end;

提前致谢。

4

1 回答 1

4

以下 Quicksort proc 应该可以完成这项工作:

//Start is the index of the first item on the list - usually 0
//Stop is the index of the last item of the list e.g. Count - 1
procedure QuickSort(var List: TStringList; Start, Stop: Integer);
var
  Left: Integer;
  Right: Integer;
  Mid: Integer;
  Pivot: integer;
  Temp: integer;
begin
  Left  := Start;
  Right := Stop;
  Mid   := (Start + Stop) div 2;

  Pivot := StrToInt(List[mid]);
  repeat
    while StrToInt(List[Left]) < Pivot do Inc(Left);
    while Pivot < StrToInt(List[Right]) do Dec(Right);
    if Left <= Right then
    begin
      Temp           := StrToInt(List[Left]);
      List[Left]  := List[Right]; // Swops the two Strings
      List[Right] := IntToStr(Temp);
      Inc(Left);
      Dec(Right);
    end;
  until Left > Right;

  if Start < Right then QuickSort(List, Start, Right); // Uses
  if Left < Stop then QuickSort(List, Left, Stop);     // Recursion
end;

而不是调用:

Files.sort;

使用以下内容:

 QuickSort(Files, 0, Files.Count - 1);

一个警告是文件内容必须是有效的整数,因为我没有为其他情况添加错误处理。

我使用的 Quicksort 函数是 Torry 的 Delpi 的修改版本:http ://www.swissdelphicenter.ch/torry/showcode.php?id=1916

于 2013-11-11T01:00:20.603 回答