问题描述:现有n个有序序列如(2,3,9),(3,5,11,23),(1,4,7,9,15,17,20),(8,15,35,9),(20,30,40),请求出第k小值。
问题分析:可用多路归并排序将所有序列进行排序后取第k个值,但是只要求求出第k小值将所有数组排序未免显得有点浪费,所以我们可以使用包含k个元素的堆完成,对于每组元素取出前k小的,依次进行比较,得到总的前k小
执行步骤:
一、建初堆:从第一组数中取出前k小的元素建初始大根堆(若不足k个则取全部元素),
二、
1 、补充堆:若堆中元素不足k个,则从下一组数中获取来补足
2、与该组元素比较:否则从下一组的第一个元素开始,依次与堆顶元素比较,
(1)若小于堆顶元素,则将该元素与堆顶元素交换,调整堆,从该组的下一个元素开始重复第2部的操作一直到该组的第k个数
(2)剪枝:若大于堆顶元素,说明后面的均会大于堆顶元素,则结束该组的比较操作
三、循环进行二的操作,直到所有数组比较完毕
四、堆顶元素即为第k小的元素
举例说明:以题目序列为例,k为5
一、建初堆,因为数组一只有三个元素,所有初始堆为三个元素
二
1、补充堆,因为堆中元素不足5个,所有用第二组元素将堆补充完整,得:
2、第二组第三个元素为11,大于堆顶元素9,属于第(2)种情况,要剪枝,所以第二组后面元素不再与堆顶元素比较
三、从第三组数到第n组数,依次执行第二步的操作
四、最终得出的堆为
所以第五大元素为堆顶元素4
时间: 2024-10-14 06:29:50