最后更新时_2011-11-22 12:16:03
辅导评Q?a target="_blank" rel="nofollow">暑期集训
在线咨询
1. 指出下列法中错误、低效之处,q将其改成一个正且高效的算法?/span>
PROCEDURE delk(A, m , last,i, k) ;
{从数组A[Q?/span>..last]中删除第i个元素v?/span> k个元素,m?/span>A上限?/span>
BEGIN
IF(i<1) OR (i>last) OR(k<0) OR(last>m)
THEN write ('error')
ELSE FOR count: = 1 TO k TO
{FOR j:=last DOWNTO i+1 DO
A[j-1]:=A[j];
last:=last-1}
ENDP;{delk} 【北方交通大?/span> 1997 一 Q?/span>10分)?/span>
【参考答案?/font>
错误有以下几处:
Q?/span>1Q过E参数没有类型说明;Q?/span>2Q出错条件判断:~少ORQ?/span>i+k>last+1Q;Q?/span>3Q删除元素时FOR循环应正向,不应用反?/span>DOWNTOQ(4Q?/span>count没定义;
低效体现在两处:
Q?/span>1Q删?/span>k个元素时Q不必一个一个元素前U,而应一ơ前U?/span>k个位|;
Q?/span>2Q?/span>last指针不应一ơ减1Q而应最后一ơ减k?/span>
正确的高效算法如下:
const m=64Q?/span>
TYPE ARR=ARRAY[1..m] OF integerQ?/span>
PROCEDURE delkQ?/span>VAR A:ARRQ?/span>VAR last:integer;i,kQ?/span>integerQ;
{从数l?/span>A[1..last]中删除第i个元素v?/span>k个元素,m?/span>A的上?/span>}
VAR countQ?/span>integerQ?/span>
BEGIN
IFQ?/span>i<0Q?/span>ORQ?/span>i>lastQ?/span>ORQ?/span>k<0Q?/span>ORQ?/span>last>mQ?/span>ORQ?/span>i+k>last+1Q?/span>
THEN writeQ?/span>’error?/span>Q?/span>
ELSE[FOR countQ?/span>= i+k TO last DO A[count-k]Q?/span>=A[count]Q?/span>
lastQ?/span>=last-kQ?/span>]
ENDQ?/span>