假设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;

解决方案 »

  1.   

    程序用递归,每次都保存arr:array of real;strlst:TStringList  的副本,
    消耗资源很大,
    1。arr:array of real;strlst:TStringList
    改成var arr:array of real;var strlst:TStringList
    试试
    2。用非递归算法。
      

  2.   

    TStringList的容量与操作系统有关,在Win9x中上限是64K。
    关于快速排序,你可以参考Delphi中的例子,多线程排序画线的。
    C:\Program Files\Borland\Delphi6\Demos\Threads
      

  3.   

    按 yang6130(2.5G) 的改为动态数组就不会有这个问题了。还有可以在Delphi中的选项设置中把最小栈的大小改大一点再编译。
    当然数据太大后用递归速度肯定很慢的。
      

  4.   

    按 yang6130(2.5G) 的方法,问题解决了。请问yang6130(2.5G),能否帮忙给出非递归算法代码。