问答题 已知关键字序列(K 1 ,K 2 ,K 3 ,…,K n-1 )是大根堆。(1)试写出一算法将(K 1 ,K 2 ,K 3 ,…,K n-1 ,K n )调整为大根堆;(2)利用(1)的算法写一个建大根堆的算法。【中科院软件所1999七、2(7分)】
【正确答案】正确答案:(1)因为前n一1个元素已经是堆,所以从第n个记录开始依次与其双亲(n/2)比较,若大于双亲则交换,继而与其双亲的双亲比较,直至满足堆的定义(最多类推到根)。核心语句段如下: j=n;R[0]=R[j]; for(i=n/2;i>=1ji=i12) if(R[0].key>R[i].key){R[j]=R[i]; j=i;} else break; R[j]=R[0]; (2)void HeapBuilder(RecType R[],int n) {for(i=2;i<=n;i++)sift(R,i);}
【答案解析】