假设arr[0..99999]存储了某银行10万个客户的存款金额,strlst存储了对应的帐号名。怎样按存款金额大小对strlst和arr重新排序。请问以下代码应怎样改,才不会堆栈溢出(当strlst.count为1000时,程序可以正常运行,但当strlst.count为10000多时,就已经堆栈溢出了)?procedure TForm1.QuickSortByArr(arr:array of real;strlst:TStringList; L, R: Integer);
var
i,j:integer;
P,TempReal: real;
TempString:String;
begin
i:=L;
j:=R;
P:=arr[(L+R) shr 1];
repeat
while (arr[i]>P) do
Inc(i);
while (arr[j]<P) do
Dec(j);
if i<=j then
begin
TempReal:=arr[i];
arr[i]:=arr[j];
arr[j]:=TempReal;
TempString :=strlst.Strings[i];
strlst.Strings[i] := strlst.Strings[j];
strlst.Strings[j] := TempString;
Inc(i);
Dec(j);
end;
until i>j;
if j>L then
QuickSortByArr(arr,strlst,L,j);
if i<R then
QuickSortByArr(arr,strlst,i,R);
end;
var
i,j:integer;
P,TempReal: real;
TempString:String;
begin
i:=L;
j:=R;
P:=arr[(L+R) shr 1];
repeat
while (arr[i]>P) do
Inc(i);
while (arr[j]<P) do
Dec(j);
if i<=j then
begin
TempReal:=arr[i];
arr[i]:=arr[j];
arr[j]:=TempReal;
TempString :=strlst.Strings[i];
strlst.Strings[i] := strlst.Strings[j];
strlst.Strings[j] := TempString;
Inc(i);
Dec(j);
end;
until i>j;
if j>L then
QuickSortByArr(arr,strlst,L,j);
if i<R then
QuickSortByArr(arr,strlst,i,R);
end;
消耗资源很大,
1。arr:array of real;strlst:TStringList
改成var arr:array of real;var strlst:TStringList
试试
2。用非递归算法。
关于快速排序,你可以参考Delphi中的例子,多线程排序画线的。
C:\Program Files\Borland\Delphi6\Demos\Threads
当然数据太大后用递归速度肯定很慢的。