![](https://csdnimg.cn/release/download_crawler_static/86365361/bg5.jpg)
A[1..8]=[30,90,65,85,50,80,10,100]
第 2 次:A[1..8]=[30,50,90,80,65,10,85,100]
A[1..8]=[30,50,80,90,10,65,85,100]
第 3 次:A[1..8]=[30,10,50,65,80,85,90,100]
A[1..8]=[10,30,50,65,80,85,90,100]
(2)Demo 的功能是将数组 A 中元素按递增顺序排序。
(3)PerfectShuffle 中 WHILE 循环内是赋值语句,共 2N 次,WHILE 外成组赋值语句,
相当 2N 个简单赋值语句;CompareExchange 中 WHILE 循环内是交换语句,最好情况下不发
生交换,最差情况下发生 N 次交换,相当于 3N 个赋值语句;Demo 中 FOR 循环循环次数
log
2
2N , 故 按 赋 值 语 句 次 数 计 算 Demo 的时间复杂度为:最好 情 况 : O(4N*log
2
2N) ≈
O(Nlog(2*N));最差情况:O((4N+3N)*log
2
2N)≈O(Nlog(2*N))。
24. 这是一个排序程序。运行后 B 数组存放 A 数组各数在排序后的位置。结果是:
A={121,22,323,212,636,939,828,424,55,262}
B={3,1,6,4,8,10,9,7,2,5}
C={22,55,121,212,262,323,424,639,828,939}
25.(1)c= (2)a=
26.(1)同上面 26 题(1)
(2)对 c 数组的赋值同所选择的下标 i 和 j 的次序(指外层循环用 j 内层用 i)没有关
系
(3)同上题 26(2)
(4)对 i,j 下标取反序后,重复执行第(3)步,A 数组所有元素均变为 2。(在机器上
验证,反复循环 3 次后,所有元素均变为 2)
27.错误有以下几处:
(1)过程参数没有类型说明; (2)出错条件判断:缺少 OR(i+k>last+1);
(3)删除元素时 FOR 循环应正向,不应用反向 DOWNTO; (4)count 没定义;
低效体现在两处:
(1)删除 k 个元素时,不必一个一个元素前移,而应一次前移 k 个位置;
(2)last 指针不应一次减 1,而应最后一次减 k。
正确的高效算法如下:
const m=64;
TYPE ARR=ARRAY[1..m] OF integer;
PROCEDURE delk(VAR A:ARR;VAR last:integer;i,k:integer);
{从数组 A[1..last]中删除第 i 个元素起的 k 个元素,m 为 A 的上限}
VAR count:integer;
BEGIN
IF(i<0)OR(i>last)OR(k<0)OR(last>m)OR(i+k>last+1)
THEN write(’error’)
ELSE[FOR count:= i+k TO last DO A[count-k]:=A[count];
last:=last-k;]
END;
28. 这是计数排序程序。