一、单项选择题
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:采用堆排序时,读入前10个元素,建立含10个元素的大根堆,而后依次扫描剩余元素,若大于堆顶,则舍弃,否则用该元素取代堆顶并重新调整堆,当元素全部扫描完毕,堆中保存的即是最小的10个元素。冒泡排序需要从后往前执行10趟冒泡才能得到10个最小的元素。两者的时间复杂度都和数据规模n线性相关,但显然堆排序的常系数更小。而快速排序、归并排序的每一趟都不能保证得到当前序列的最小值,也无法达到线性时间复杂度。
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:这是小根堆,关键字最大的记录一定存储在这个堆所对应的完全二叉树的叶结点中;又因为二叉树中的最后一个非叶结点存储在Ln/2]中,所以关键字最大记录的存储范围为Ln/2]+1~n。
正确答案:
————————————————————
————————————————————
解析:在向有n个元素的堆中插入一个新元素时,需要调用一个向上调整的算法,比较次数最多等于树的高度减1,因为树的高度为Llogzn]+1,所以堆的向上调整算法的比较次数最多等于LlogznJ.此处需要注意,调整堆和建初始堆的时间复杂度是不一样的,读者可以仔细分析两个算法的具体执行过程。
正确答案:
————————————————————
————————————————————
解析:建堆过程中,向下调整的时间与树高h有关,为O(h)。每次向下调整时,大部分结点的高度都较小。因此,可以证明在元素个数为n的序列上建堆,其时间复杂度为O(n)。无论是在最好情况下还是在最坏情况下,堆排序的时间复杂度均为O(nlog2n)。
正确答案:
————————————————————
————————————————————
解析:简单选择排序的比较次数始终为n(n-1)/2,与序列状态无关。
正确答案:
————————————————————
————————————————————
解析:堆是顺序存储的完全二叉树,因此其高度小于或等于结点数相同的二叉排序树,A 正确。B显然正确。根据小根堆的定义,其根结点到任意叶结点的路径构成从小到大的序列,C正确。堆的各层结点之间没有大小要求,因此层序遍历不能保证得到有序序列,D错误。
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:筛选法初始建堆为{8,17,23,52,25,72, 68,71,60},输出8后重建的堆为{17,25,23,52,60,72,68,71},输出17后重建的堆为{23,25,68,52,60,72,71}。
正确答案:
————————————————————
————————————————————
解析:初始序列是一棵顺序存储的完全二叉树,然后根据大根堆的要求,按照从下到上、从右到左的顺序进行调整。98和77比较,98和77交换(交换1次);14和35比较,35和35比较,不交换;98和55比较,98和62比较,98和62交换(交换1次);62和77比较,77和62交换(交换1次);98和35比较,98和48比较,98和48交换(交换1次);77和55比较,77和48比较,77和48交换(交换1次);48和62比较,62和48交换(交换1次),一共交换6次。
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:红黑树和二叉查找树的中序序列是有序序列,从根结点到任意叶结点的路径不能保证是有序的。哈夫曼树是根据权值按一定规则构造的树,和关键字次序无关。若是小根堆,则从根结点到任意叶结点的路径是升序序列;若是大根堆,则从根结点到叶结点的路径是降序序列。
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:
正确答案:
————————————————————
————————————————————
解析:简单概念题。堆是一棵完全树,采用一维数组存储,Ⅰ正确,Ⅱ正确。大根堆只要求根结点值大于左右孩子值,并不要求左右孩子值有序,Ⅲ错误。堆的定义是递归的,所以其左右子树也是大根堆,所以堆的次大值一定是其左孩子或右孩子,IⅣ正确。
正确答案:
————————————————————
————————————————————
解析:
正确答案:
二、综合应用题
————————————————————
————————————————————
解答:以小根堆为例,堆的特点是双亲结点的关键字必然小于或等于该孩子结点的关键字,而两个孩子结点的关键字没有次序规定。在二叉排序树中,每个双亲结点的关键字均大于左子树结点的关键字,均小于右子树结点的关键字,也就是说,每个双亲结点的左、右孩子的关键字有次序关系。这样,当对两种树执行中序遍历后,二叉排序树会得到一个有序的序列,而堆则不一定能得到一个有序的序列。
————————————————————
————————————————————
解答:
————————————————————
————————————————————
解答:
在基于比较的排序算法中,插入排序、快速排序和归并排序只有在将元素全部排完序后,才能得到前k个最小的元素序列,算法的效率不高。
冒泡排序、堆排序和简单选择排序可以,因为它们在每一趟中都可以确定一个最小的元素。采用堆排序最合适,对于n个元素的序列,建立初始堆的时间不超过4n,取得第k个最小元素之前的排序序列所花的时间为klogzn,总时间为4n + klogan;冒泡和简单选择排序完成此功能所花的时间为kn,当k≥5时,通过比较可以得出堆排序最优。