unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, StdCtrls, Grids;type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    SG: TStringGrid;
    Button1: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    function partition(p,q:Integer;A:Array of Integer):Integer;
    procedure Quick_Sort(p,q:Integer;A:Array of Integer);
    { Public declarations }
  end;var
  Form1: TForm1;
  A:Array[1..100] of Integer;implementation{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
    i:integer;
begin
    for i:=0 to 99 do
    begin
        SG.Rows[i].Text:=IntToStr(Random(10000));
    end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
    i,j,k,t:Integer;
begin
    for i:=0 to 99 do
    begin
        A[i]:=StrToInt(Trim(SG.Rows[i].Text));
    end;
    for j:=1 to 99 do
    begin
        for k:=0 to (99-j) do
        begin
            if A[k]>A[k+1] then
            begin
               t:=A[k];
               A[k]:=A[k+1];
               A[k+1]:=t;
            end;
        end;
    end;
    for i:=0 to 99 do
    begin
        SG.Rows[i].Text:=IntTostr(A[i]);
    end;
end;procedure TForm1.Button3Click(Sender: TObject);
var
    i:Integer;
begin
    for i:=1 to 100 do
    begin
        A[i]:=StrToInt(Trim(SG.Rows[i-1].Text));
    end;    Quick_Sort(1,100,A);
    for i:=1 to 100 do
    begin
        SG.Rows[i-1].Text:=IntTostr(A[i]);
    end;
end;procedure TForm1.Quick_Sort(p,q:Integer;A:Array of Integer);
var
    r:Integer;
begin
    r:=partition(p,q,A);
    Quick_Sort(p,r,A);
    Quick_Sort(r+1,q,A);
end;Function TForm1.partition(p,q:Integer;A:Array of Integer):Integer;
var
    t,j,k,m:Integer;
begin
    t:=A[p];
    j:=p-1;
    k:=q+1;
    while true do
    begin
        repeat k:=k-1 until A[k]<=t;
        repeat j:=j+1 until A[j]>=t;
        if j<k then
        begin
            m:=A[j];
            A[j]:=A[k];
            A[k]:=m;
        end
        else if k<>100 then
        begin
            partition:=k;
            exit;
        end
        else
        begin
            partition:=(k-1);
            exit;
        end;
    end;
end;end.

解决方案 »

  1.   

    for i:=0 to 99 do
        begin
        //    A[i]:=StrToInt(Trim(SG.Rows[i].Text));有A[0]
        end;
     //A:Array[1..100] of Integer;这里好象有问题了;下标不一样;
      

  2.   

    for i:=0 to 99 do
        begin
        //    A[i]:=StrToInt(Trim(SG.Rows[i].Text));有A[0]
        end;
    //A:Array[1..100] of Integer;对就是这里!你下标定义的是从1到100,而打循环体是从0到99,当然出错!!
    要么你这样A:Array[1..100] of Integer;
    要么你这样
    for i:=1 to 100 do
        begin
        //    A[i]:=StrToInt(Trim(SG.Rows[i].Text));有A[0]
        end;
      

  3.   

    我有PASCAL的快速排序,要不要看啊