试题四(共15分)阅读下列说明和C代码,回答问题1至问题 3,将解答写在答题纸的对应栏内。【说明】堆数据结构定义如下:在一个堆中,若堆顶元素为最大元素,则称为大顶堆;若堆顶元素为最小元素,则称为小顶堆。堆常用完全

题目

试题四(共15分)

阅读下列说明和C代码,回答问题1至问题 3,将解答写在答题纸的对应栏内。

【说明】

堆数据结构定义如下:

在一个堆中,若堆顶元素为最大元素,则称为大顶堆;若堆顶元素为最小元素,则称为小顶堆。堆常用完全二叉树表示,图4-1 是一个大顶堆的例子。

堆数据结构常用于优先队列中,以维护由一组元素构成的集合。对应于两类堆结构,优先队列也有最大优先队列和最小优先队列,其中最大优先队列采用大顶堆,最小优先队列采用小顶堆。以下考虑最大优先队列。

假设现已建好大顶堆A,且已经实现了调整堆的函数heapify(A, n, index)。

下面将C代码中需要完善的三个函数说明如下:

(1)heapMaximum(A):返回大顶堆A中的最大元素。

(2)heapExtractMax(A):去掉并返回大顶堆 A的最大元素,将最后一个元素“提前”到堆顶位置,并将剩余元素调整成大顶堆。

(3)maxHeapInsert(A, key):把元素key插入到大顶堆 A的最后位置,再将 A调整成大顶堆。

优先队列采用顺序存储方式,其存储结构定义如下:

define PARENT(i) i/2

typedef struct array{

int *int_array; //优先队列的存储空间首地址

int array_size; //优先队列的长度

int capacity; //优先队列存储空间的容量

} ARRAY;

【C代码】

(1)函数heapMaximum

int heapMaximum(ARRAY *A){ return (1) ; }

(2)函数heapExtractMax

int heapExtractMax(ARRAY *A){

int max;

max = A->int_array[0];

(2) ;

A->array_size --;

heapify(A,A->array_size,0); //将剩余元素调整成大顶堆

return max;

}

(3)函数maxHeapInsert

int maxHeapInsert(ARRAY *A,int key){

int i,*p;

if (A->array_size == A->capacity) { //存储空间的容量不够时扩充空间

p = (int*)realloc(A->int_array, A->capacity *2 * sizeof(int));

if (!p) return -1;

A->int_array = p;

A->capacity = 2 * A->capacity;

}

A->array_size ++;

i = (3) ;

while (i > 0 && (4) ){

A->int_array[i] = A->int_array[PARENT(i)];

i = PARENT(i);

}

(5) ;

return 0;

}

【问题 1】(10分)

根据以上说明和C代码,填充C代码中的空(1)~(5)。

【问题 2】(3分)

根据以上C代码,函数heapMaximum、heapExtractMax和 maxHeapInsert的时间复杂度的紧致上界分别为 (6) 、 (7) 和 (8) (用O 符号表示)。

【问题 3】(2分)

若将元素10插入到堆A =〈15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1〉中,调用 maxHeapInsert函数进行操作,则新插入的元素在堆A中第 (9) 个位置(从 1 开始)。

如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

若将元素10插入到堆A=(15,13,9,5,12,8,7,4,0,6,2,1)中,调用maxHeaplnsert函数进行操作,则新插入的元素在堆A中第(9)个位置(从1开始)。


正确答案:(9)3
(9)3 解析:依照maxHeapInsert的算法,可有如下几步:
第一步:i=13 PARENT(i)=6key=10 A->int_array [PARENT(i)]=8
由于key>A->int_array[PARENT(i)]
所以符合while循环条件,执行:
A->int_array[i]=A->int_array[PARENT(i)];
i=PARENT(i);
即:

第二步:i=6 PARENT(i)=3key=10 A->int_array [PARENT (i)]=9
由于key>A->int_array[PARENT(i)]
所以符合while循环条件,执行:
A->int_array[i]=A->int_array[PARENT(i)];
i=PARENT(i);
即:

第三步:i=3 PARENT(i)=1key=10 A->int_array [PARENT(i)]=15
由于keyint_array[PARENT(i)]
所以不符合while循环条件,跳出循环。
执行:A->int_array[i]=key;
即:

所以,插入元素10的位置在第三个位置。

第2题:

高度为h的堆中,最多有(52)个元素,最少有(53)个元素,在大根堆中,关键字最小的元素可能存放在堆的(54)地方。

A.2h-1

B.2h-1

C.2h

D.2h+1


正确答案:A

第3题:

在一个大顶堆中,最小元素不一定在最后。()

此题为判断题(对,错)。


正确答案:对

第4题:

在含有n个关键字的小根堆(堆顶元素最小)中,关键字最大的记录有可能存储的位置是()。


答案:D
解析:

第5题:

对于n个元素的关键字序列{k1,k2,…,kn},若将其按次序对应到一棵具有n个结点的完全二叉树上,使得任意结点都不大于其孩子结点(若存在孩子结点),则称其为小顶堆。根据以上定义,(43)是小顶堆。

A.

B.

C.

D.


正确答案:D
解析:本题考查排序方法中堆排序的基础知识。,对于n个元素的关键字序列{k1,k2,…,kn},当且仅当满足下列关系时称其为堆:①ki≤k2i且ki≤k2i+1或者②kik2i且kik2i+1其中,1≤i≤|n/2|,满足①式称为小顶堆,满足②式称为大顶堆。显然,题目中选、项A中25与23和51之间的关系不满足小顶堆的定义;选项B中51与63和25之间、 55与23之间的关系不满足小顶堆的定义;选项C的情况与B类似。选项D是小顶堆。

第6题:

在一个堆的顺序存储中,若一个元素的下标为i(0≤i≤n-1),则它的左孩子元素的下标为【 】。


正确答案:2i+1
2i+1 解析:堆的顺序存储是从0开始的,所以其左孩子的元素下标为2i+k,右孩子元素的下标为2i+2。

第7题:

● 对于n 个元素的关键字序列{k1,k2,…,kn}, 若将其按次序对应到一棵具有 n 个结点的完全二叉树上, 使得任意结点都不大于其孩子结点(若存在孩子结点), 则称其为小顶堆。根据以上定义, (43) 是小顶堆


正确答案:D

第8题:

一组记录的关键字序列为(47,80,57,39,41,46),利用堆排序的方法建立的初始堆为回答( )(堆顶元素是最小元素,采用树的形式建堆)。

A. 39,41,57,80,47,46       

B.39,41,46,80,47,57 

C. 39,47,46,80,41,57    

D.39,41,57,80,46,47  

输出堆顶元素后,调整后的堆为回答( )。 

A.41,47,46,80,57       

B.41,57,46,80,47

C.41,57,80,47,46        

D.41,80,46,47,57


参考答案:1.B

第9题:

对于n个元素的关键字序列K1,K2,…,Kn,若有Ki≤K2i≤且Ki≤2i+1(i=1,2,…,[n/2],2i+1≤n),则称其为小根堆。以下关于小根堆及其元素关系的叙述中,错误的是( )。

A.关键字序列K1,K2,…,Kn呈非递减排序时一定为小根堆

B.小根堆中的序列K1,K2,K4…,K2j(2j≤n)一定为非递减序列

C.小根堆中元素K2i与K2i+1(2i≤n,2i+1≤n)之间的大小关系不能确定

D.小根堆的最后一个元素一定是序列的最大元素


正确答案:D
解析:小根堆中元素比它本身的根小,它和它的兄弟没有大小关系。

第10题:

堆排序分为两个阶段,其中第一阶段将给定的序列建成一个堆,第二阶段逐次输出堆顶元素。设给定序列{48,62,35,77,55,14,35,98},若在堆排序的第一阶段将该序列建成一个堆(大根堆),那么交换元素的次数为()。

A.5
B.6
C.7
D.8

答案:B
解析:

更多相关问题