问题叙述性说明:现有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-12-13 01:24:29