请高手指点一下!我要用Delphi编一个快速排序问题,不知道那里出错 ( 积分: 50 )

  • 主题发起人 主题发起人 qrj
  • 开始时间 开始时间
Q

qrj

Unregistered / Unconfirmed
GUEST, unregistred user!
我是用2个Listbox和两个按纽,第一个按纽控制listbox1,第二个按纽用快速排序实现对listbox1里的10随机数按从小到大排列,并在listbox2中输出结果,希望大家帮帮忙啊!!!谢谢!!!
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 9 do
begin
ListBox1.Items.Add(IntToStr(Random(10)));
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
low,high,m,temp:integer;
a:Array[0..9] of integer;
begin
for m:=0 to 9 do
begin
a[m]:=StrToInt(ListBox1.Items[m+1]);
end;
low:=0;
High:=9;
temp:=a[0];
while low<high do
begin
while (low<high) And (a[high]>=temp) do
begin
high:=high-1;
a[low]:=a[high];
end;
while (low<high) And (a[low]<=temp) do
begin
low:=low+1;
a[high]:=a[low];
end;
end;
a[low]:=a[0];
for m:=0 to 9 do
begin
ListBox2.Items.Add(IntToStr(a[m]));
end;
end;

end.
 
我是用2个Listbox和两个按纽,第一个按纽控制listbox1,第二个按纽用快速排序实现对listbox1里的10随机数按从小到大排列,并在listbox2中输出结果,希望大家帮帮忙啊!!!谢谢!!!
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 9 do
begin
ListBox1.Items.Add(IntToStr(Random(10)));
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
low,high,m,temp:integer;
a:Array[0..9] of integer;
begin
for m:=0 to 9 do
begin
a[m]:=StrToInt(ListBox1.Items[m+1]);
end;
low:=0;
High:=9;
temp:=a[0];
while low<high do
begin
while (low<high) And (a[high]>=temp) do
begin
high:=high-1;
a[low]:=a[high];
end;
while (low<high) And (a[low]<=temp) do
begin
low:=low+1;
a[high]:=a[low];
end;
end;
a[low]:=a[0];
for m:=0 to 9 do
begin
ListBox2.Items.Add(IntToStr(a[m]));
end;
end;

end.
 
你这是快速排序吗?

delphi原代码中自己带快速排序算法 的, 抄过来就是了
 
another_eyes
delphi中有自己自带的快速排序法吗,请指点一下。
 
假如只是数字1-9的话本身有属性SORT啊。

如果不是冒泡不就行了?
 
Delphi的快速排序算法,快速排序是递归的:
procedure QuickSort(var AData:array of integer; AFirst, ALast: integer);
var
nLower,nUpper:integer;
nTemp:integer;
begin
nLower:=AFirst+1;
nUpper:=ALast;

//用边界值把数据分成两部分,边界值是数组首元素
while nLower<nUpper do
begin
//找比边界值更小的数,准备交换到左边
while AData[nLower]<AData[AFirst] do Inc(nLower);
//找比边界值更大的数,准备交换到右边
while AData[nUpper]>AData[AFirst] do Dec(nUpper);

//交换
if nLower<nUpper then
begin
nTemp:=AData[nLower];
AData[nLower]:=AData[nUpper];
AData[nUpper]:=nTemp;

Inc(nLower);
Dec(nUpper);
end
else
begin
Inc(nLower);
end;
end;

//将边界值与串中间的值交换,成为新的边界值
nTemp:=AData[AFirst];
AData[AFirst]:=AData[nUpper];
AData[nUpper]:=nTemp;

//分别处理两个子串
if AFirst<nUpper-1 then
QuickSort(AData,AFirst,nUpper-1);
if nUpper+1<ALast then
QuickSort(AData,nUpper+1,ALast);
end;
 
1、你的错误在 a[m]:=StrToInt(ListBox1.Items[m+1]);这一行
应该为 a[m]:=StrToInt(ListBox1.Items[m]);
2、我测了一下。你的排序算法没有效果啊
 
算法本身就是错误的
 
找本数据结构来看看,很容易的。
 
后退
顶部