首页 > 代码库 > 多个有序数列中查找第k小值

多个有序数列中查找第k小值

        问题描述:现有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


多个有序数列中查找第k小值