我需要在Delphi中排序接近1,00,000个浮点项。我是Delphi的新手,想知道是否有现成的解决方案。我尝试了一些语言提供的构造,并且他们需要花费大量的时间才能完成。(应用程序的执行时间为5-10秒)
答案 0 :(得分:14)
为什么不实施快速排序算法?
看到这个简单的代码
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的\演示\线程
路径,对于使用不同排序算法和线程的酷演示应用程序。
答案 1 :(得分:2)
您使用的是哪个版本?如果您使用的是Delphi 2009或2010,则可以使用泛型来生成TList<real>
并调用其Sort方法。
如果您使用的是早期版本,非通用TList也有一个Sort方法,但设置起来有点棘手,因为它使用指针和Real(或Double),这是你可能想要的用作浮点数,太大而无法转换为指针。