菜鸟求教 关于快速排序
pascal吧
全部回复
仅看楼主
level 1
ysjkejd 楼主
关于快速排序的一个练习
只学了半年的pascal,所以基础很弱,所以找了很久,也没找出问题。
大概的想法和书上的快速排序的算法估计差不多。。。。但老是报错
主要是想用递归来做
程序如下
万望指教
*********************************************************************************************
var
a:array[1..100] of integer;
n:integer;
procedure p(var r:array of integer;f,l:integer); {程序部分}
var
i,j,k,h,mid:integer;
begin {p}
i:=f; h:=l; mid:=(i+h) div 2; k:=a[mid]; {mid为中间数,k为比较的基准}
repeat
while(i<=mid)and (r[i]<=k) do
inc(i); {找到右到左 ,找一个大于k的数}
while (h>=mid)and (r[h]>=k) do
dec(h); {从左到右找一个小于k的数}
if h>i then {
begin {if}
j:=r[h]; 与排序目标不一致,进行交换
r[h]:=r[i];
r[i]:=j;
end; {if} }
if i<=mid then inc(i); {继续搜索
if h>=mid then dec(h) }
until i=h;
while ((l-h)<>0) and (l>h) do {对基准右部进行递归}
p(r[n],h,l);
while ((i-f)<>0) and (i>f) do {对基准左部进行递归}
p(r[n],f,i);
end; {p}
begin
for n:=1 to 8 do
read(a[n]); {读入数组}
p(a[n],1,8); {调用程序}
for n:=1 to 8 do
write(a[n]:4); {输出}
end.
*******************************************************************************
可以运行,但是读入数组之后,就报错。
exitcode=201
万望指教
感激不尽
2014年05月18日 11点05分 1
level 1
你迟早会发现你犯的错误都是低级算法中的低级、中级、高级错误的……
话说左右递归套上一个while循环是要闹哪样[冷]
具体程序参见free pascal\demo\text中的qsort.pp
2014年05月18日 12点05分 2
居然还犯了高级错误。。。居然有种好高兴的感觉。。。。。。 不过,左右递归可以不加while吗,不是要判断左右两边的两个无序数组是否已经排完了吗。 另:万分感谢
2014年05月18日 13点05分
回复 フ别天神 :这叫高级错误吗……调用一遍之后即保证有序,不然你主程序里也要判断一下不成?
2014年05月18日 13点05分
回复 123theboss :原来如此。。。。。。任重而道远啊
2014年05月18日 13点05分
level 13
动态数组很恶心的
LZ a和r没分好
procedure qsort(l,r:longint);
var x,y,i,j:longint;
begin
i:=l;
j:=r;
x:=a[(l+r)div 2];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
2014年05月18日 13点05分 3
a和r哪里确实是我的基础差的原因。。。。 不过话说最后哪里,非得把while 改成if吗
2014年05月18日 13点05分
level 9
中间数要先换到末端,在其余的数分组(即大於及小於等如中间数的两个组别)完成之后,再换到两组的分界位置上,这样方为正确。另外,当要排序的数较少时,就不要再快排,可以用比如是选择排序或者是插入排序。
2014年05月22日 05点05分 4
抱歉。回头一想,其实不需要把中间数要先换到末端。特此更正。
2014年05月23日 03点05分
快排的原理总结如下: 简单而言,只要在分组时把小於或等如中间数的一组排在前半部份,而大於或等如中间数的一组排在后半部份,再呼叫快排程序把这两部份分别的由小至大排序,最后就会得到正确的排列次序(即由小至大)。 当要排序的数较少时,就不要再快排,可以用比如是选择排序或者是插入排序。
2014年05月23日 03点05分
回复 fourz238 :十分感谢
2014年05月23日 04点05分
1