麻烦算法高手帮看看我的快速排序,怎么都排不对?
procedure Sort(stringList:TStringList;left,right:integer);
var
    i,j:integer;
    vot:string;
begin
    if (left<right) then
    begin
      i:=left;
      j:=right;
      vot:=stringList[i];
      while (i<>j) do
      begin
        while (CompareStr(vot,stringList[i])<0) and (i<j) do
        j:=j-1;
        if (i<j) then
        begin
        stringList[i]:= stringList[j];
        i:=i+1;
        end;
        while (CompareStr(vot,stringList[i])>0) and (i<j) do
        i:=i+1;
        if (i<j) then
        begin
        stringList[j]:= stringList[i];
        j:=j-1;
        end;
      end;
      stringList[i]:=vot;
      i:=i+1;
      j:=j-1;
      Sort(stringList,left,j);
      Sort(stringList,i,right);
    end;end;

解决方案 »

  1.   

    procedure Sort(stringList:TStringList;L, R: Integer);
    var
      I, J, P: Integer;
      vot:string;
    begin
      repeat
        I := L;
        J := R;
        P := (L + R) shr 1;
        repeat
          vot := stringList.Strings[P];
          while CompareStr(vot,stringList.Strings[I]) < 0 do Inc(I);
          while CompareStr(vot,stringList.Strings[J]) > 0 do Dec(J);
          if I <= J then
          begin
            vot := stringList.Strings[I];
            stringList.Strings[I] := stringList.Strings[J];
            stringList.Strings[J] := vot;
            if P = I then
              P := J
            else if P = J then
              P := I;
            Inc(I);
            Dec(J);
          end;
        until I > J;
        if L < J then Sort(stringList,L, J);
        L := I;
      until I >= R;
    end;
      

  2.   

    procedure Sort(stringList: TStringList; left, right: integer);
    var
      i, j: integer;
      vot, Temps: string;
    begin
      i := left;
      j := right;
      vot := stringList[(i + j) div 2];
      repeat
        while stringList[i] < vot do Inc(i);
        while stringList[j] > vot do Dec(j);
        if i <= j then
        begin
          Temps := stringList[i];
          stringList[i] := stringList[j];
          stringList[j] := Temps;
          Inc(i);
          Dec(j);
        end;
      until i > j;
      if j > left then Sort(stringList, left, j);
      if i < right then Sort(stringList, i, right);
    end;