求pascal快排标程一定要对的求
以下来自百度知道,回答者是Shek_PS :
原理:把数组分成两边,使左边的数总是小于右边的,再分别排序(好像是分治。。。。)
procdure sort(l,r:longint);
var
i,j,x,y:longint;
begin
i:=l;j:=r;x:=a[(i+j) shr 1];
{shr 1就是 div 2,x似乎只是用来比较的}
repeat
while a[i]j) then begin
y:=a[i];a[i]:=a[j];a[j]:=i;
{把较小的数换到左边}
inc(i);dec(j);
end;
until i>j;
{repeat {循环后保证有a[i]左边...全部
以下来自百度知道,回答者是Shek_PS :
原理:把数组分成两边,使左边的数总是小于右边的,再分别排序(好像是分治。。。。)
procdure sort(l,r:longint);
var
i,j,x,y:longint;
begin
i:=l;j:=r;x:=a[(i+j) shr 1];
{shr 1就是 div 2,x似乎只是用来比较的}
repeat
while a[i]j) then begin
y:=a[i];a[i]:=a[j];a[j]:=i;
{把较小的数换到左边}
inc(i);dec(j);
end;
until i>j;
{repeat {循环后保证有a[i]左边的数都比右边的小}
if l=pivot;
//移动右指针,注意这里不能用while循环
7 if ir then return j //返回j的值作为分割点
9 else return j-1; //返回j前一位置作为分割点
end;
end;
该算法的实现很精巧。
其中,有一些细节需要注意。例如,算法中的位置i和j不会超出A[p。。r]的位置界,并且该算法的循环不会出现死循环,如果将两个repeat语句换为while则要注意当L[i]=L[j]=pivot且i
另外,最后一个if。。then。。语句很重要,因为如果pivot取的不好,使得Partition结束时j正好等于r,则如前所述,算法Quick_Sort会无限递归下去;因此必须判断j是否等于r,若j=r则返回j的前驱。
。收起