下是面参照别人代码写的快速排序写的过种;得不到正确结果,不知错在哪了,请帮忙;procedure TForm1.sort(a: array of integer; l, r: integer);
var i,j,mid,temp:integer;
begin
i:=l;j:=r; mid:=a[(l+r) div 2]; {将当前序列在中间位置的数定义为中间数} 
repeat 
while a[i]< mid do inc(i); {在左半部分寻找比中间数大的数}
while mid< a[j] do dec(j);{在右半部分寻找比中间数小的数} 
if i<=j then
begin {若找到一组与排序目标不一致的数对则交换它们}
  temp := a[i];
  a[i] := a[j];
  a[j] := temp;
  inc(i);
  dec(j); {继续找}
end; 
until i >j; 
if l< j then sort(a,l,j); {若未到两个数的边界,则递归搜索左右区间}
if i< r then sort(a,i,r);
end;{sort}

解决方案 »

  1.   

    procedure QuickSort(var SortNum:array of integer;p,r:integer);
      procedure swap(var a,b:integer);  //交换
      var tmp:integer;
      begin
        tmp:=a;
        a:=b;
        b:=tmp;
      end;
      function partition(var SortNum:array of integer;p,r:integer):integer; //划分
      var i,j,x:integer;
      begin
        i:=p;j:=r+1;
        x:=SortNum[p];
        while true do
        begin
          repeat inc(i)
          until SortNum[i]<x;
          repeat inc(j,-1)
          until SortNum[j]>x;
          if i>=j then break;
          swap(SortNum[i],SortNum[j]);
        end;
        SortNum[p]:=SortNum[j];
        SortNum[j]:=x;
        result:=j;
      end;
    var q:integer;
    begin
      if p<r then
      begin
        q:=partition(SortNum,p,r);
        QuickSort(SortNum,p,q-1);
        QuickSort(SortNum,q+1,r);
      end;
    end;
      

  2.   

    {少了等号
     repeat inc(i)
          until SortNum[i]=<x;
     修改以后测试
    }
    program Project1;{$APPTYPE CONSOLE}uses
      SysUtils;procedure QuickSort(var SortNum: array of integer; p, r: integer);
      procedure swap(var a, b: integer); //交换
      var
        tmp: integer;
      begin
        tmp := a;
        a := b;
        b := tmp;
      end;
      function partition(var SortNum: array of integer; p, r: integer): integer;
      var
        i, j, x: integer;
      begin
        i := p;
        j := r + 1;
        x := SortNum[p];
        while true do
        begin
          repeat inc(i)
          until SortNum[i] <= x;
          repeat inc(j, -1)
          until SortNum[j] >= x;
          if i >= j then
            break;
          swap(SortNum[i], SortNum[j]);
        end;
        SortNum[p] := SortNum[j];
        SortNum[j] := x;
        result := j;
      end;
    var
      q: integer;
    begin
      if p < r then
      begin
        q := partition(SortNum, p, r);
        QuickSort(SortNum, p, q - 1);
        QuickSort(SortNum, q + 1, r);
      end;
    end;
    var
      SortNum: array of integer;
      i: integer;
    begin
      { TODO -oUser -cConsole Main : Insert code here }
      //[4,3,7,8,1,2,9]
      setlength(SortNum, 7);
      SortNum[0] := 4;
      SortNum[1] := 3;
      SortNum[2] := 7;
      SortNum[3] := 8;
      SortNum[4] := 1;
      SortNum[5] := 2;
      SortNum[6] := 9;
      QuickSort(SortNum, 0, 6);
      writeln(format('[%d,%d,%d,%d,%d,%d,%d]', [SortNum[0], SortNum[1], SortNum[2],
        SortNum[3], SortNum[4], SortNum[5], SortNum[6]]));
      readln;end.