【问题标题】:Delphi : Sorted ListDelphi:排序列表
【发布时间】:2010-03-21 03:08:04
【问题描述】:

我需要在 Delphi 中对接近 1,00,000 个浮点条目进行排序。我是 Delphi 的新手,想知道是否有现成的解决方案可用。我尝试了一些语言提供的构造,它们需要花费大量时间才能完成。(5-10 秒的执行时间对于应用程序来说很好)

【问题讨论】:

  • 您使用了哪些语言提供的结构,用了多长时间?
  • 这个 '1,00,000' 是错字还是 100,000 的奇怪格式?
  • 我怀疑它使用了印度风格的数字分组http://en.wikipedia.org/wiki/Indian_numbering_system

标签: delphi sorting scalability


【解决方案1】:

为什么不直接实现快速排序算法?

看这个简单的代码

program ProjectSortFoat;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure QuickSort(var List: array of Double; iLo, iHi: Integer) ;
var
  Lo       : integer;
  Hi       : integer;
  T        : Double;
  Mid      : Double;
begin
  Lo := iLo;
  Hi := iHi;
  Mid:= List[(Lo + Hi) div 2];
  repeat

    while List[Lo] < Mid do Inc(Lo) ;
    while List[Hi] > Mid do Dec(Hi) ;

    if Lo <= Hi then
    begin
      T := List[Lo];
      List[Lo] := List[Hi];
      List[Hi] := T;
      Inc(Lo);
      Dec(Hi);
    end;

  until Lo > Hi;

  if Hi > iLo then QuickSort(List, iLo, Hi);
  if Lo < iHi then QuickSort(List, Lo, iHi);

end;



const
Elements = 1000000;
var
  doubleArray : array of Double;
  i           : integer;
  t           : TDateTime;
begin
  SetLength(doubleArray,Elements);
  try
    t:=Now;
    Writeln('Init Generating '+FormatFloat('#,',Elements)+' random numbers ');
    for i:=low(doubleArray) to high(doubleArray) do
    doubleArray[i]:=Random(10000000)+Random; //can be improved
    Writeln('Elapsed '+FormatDateTime('HH:NN:SS.ZZZ',Now-t));

    t:=Now;
    Writeln('Sorting '+FormatFloat('#,',Elements)+' random numbers ');
    QuickSort(doubleArray, Low(doubleArray), High(doubleArray)) ;
    Writeln('Elapsed '+FormatDateTime('HH:NN:SS.ZZZ',Now-t));

  finally
  Finalize(doubleArray);
  end;
  Readln;
end.

在我的机器上,对 1.000.000 个浮点数进行排序的执行时间是 0.167 秒

如果您有 delphi 7 或其他旧版本(我不知道新版本中是否存在),您可以查看

C:\程序 文件\Borland\Delphi7\Demos\Threads

路径,一个很酷的演示应用程序,使用不同的排序算法和线程。

【讨论】:

  • Threads 演示仍在 Delphi 2010 中。在开始菜单中有一个指向 Demos 目录的链接。
  • @Bruce 你是对的,在 Delphi 2010 中路径是 C:\Users\Public\Documents\RAD Studio\7.0\Demos\DelphiWin32\VCLWin32\Threads
  • 路径取决于您的操作系统,因此人们可能更容易使用 Rad Studio 链接。
  • @PRUZ:谢谢。我在我的应用程序中使用了它,它很快:-)。我正在使用 Delphi 7,我搜索了一个 SortedList 实现,而是找到了一个带有扩展数组的 SortArrayAscending 过程,这需要很长时间。我假设由于语言提供的排序需要很长时间,我自己的排序实现可能需要更长的时间。我的错。
【解决方案2】:

你用的是什么版本?如果您在 Delphi 2009 或 2010 中,您可以使用泛型创建一个 TList&lt;real&gt; 并调用其 Sort 方法。

如果您使用的是早期版本,非泛型 TList 也有一个 Sort 方法,但设置起来有点棘手,因为它使用指针和 Real(或 Double),这可能是您想要的用作浮点数,太大而无法转换为指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多