BEGIN a[j+h]:
=a[j]; j:
=j-h END; {再找前一间隔的数来比,注①}
a[j+h]:
=t {出当循环,把t插入在j+h的位置上}
END {当i>n,一趟排序结束}
UNTIL h=1 {增量为1时,整个排序结束}
五)快速排序
快速排序的算法在教材p.229~p.232中已讲解,下面给出回溯算法(PAIXU5)与递归算法(PAIXU5A)的两个程序。
可对比着看,了解如何把递归算法的程序转化为非递归的程序。
这两种算法在以下章节中讲解。
如在此理解有困难可在学习回溯算法与递归算法时再来阅读。
1) 回溯算法的快速排序(paixu5)
PROGRAM PaiXu5; {用回溯算法的快速排序}
CONST n=15;
s0:
ARRAY [1..n] OF Byte=(60,38,55,94,93,16,86,73,24,58,22,99,49,15,43);
VAR i,j,k,l,h,c,t:
Byte; f:
Boolean;
s,a,b:
ARRAY [1..n] OF Byte;
PROCEDURE Pr; {过程----输出一趟排序的结果,并输出变量交换的情况}
BEGIN
Writeln(''i='':
5,i,''j='':
5,j,''t='':
5,t,''t--->s['':
10,i,'']'');{输出交换分界点}
FOR k:
=1 TO n DO Write(s[k]:
5); Writeln {输出一趟排序的结果}
END;
BEGIN
FOR i:
=1 TO n DO {读入数据及输出}
BEGIN s[i]:
=s0[i]; Write(s[i]:
5) END; Writeln;
l:
=1; h:
=n; c:
=0; {l为头指针,h为尾指针,c栈指针}
REPEAT {用直到循环来完成排序}
f:
=True; {用f来控制直到循环}
WHILE l i:
=l; j:
=h; t:
=s[l];{i,j取头尾指针,数据t为比较的依据,分成小于大于两部分}
WHILE i WHILE (it) DO j:
=j-1; {当i IF i=s[j],如再i s[i]:
=s[j]; i:
=i+1; {s[i]取a[j]值,i向后移}
WHILE (i=i+1; {当i IF i=s[i]; j:
=j-1 END {s[j]取a[i]值,j向前移}
END {一直操作i=j为止}
END;
s