第k小的数

Posted by 大雁小鱼的博客 on May 27, 2018

求第K小的数

输入n个整数和一个正整数K,输出这些整数从小到大排序后的第K个数。n小于10的7次方

思路一

选择第K小的数,最显然的方法是先排序,然后直接输出下标为K-1的元素,但是由于n的规模比较大,可能性能不可接受。
最快的排序的时间复杂度:

思路二

使用半个快排。假设在快速排序的“划分”结束后,数组A[p..r]被划分为了A[p..q]和A[q+1..r],则可根据左边元素的个数q-r+1和K的关系只在左边或者只在右边递归求解即可。
在期望的意义下,程序的时间复杂度是O(N)。
注意:这个思路有个致命缺陷,就是会修改原数组,所以不适合海量数据的场合。

思路三

使用大根堆。维护一个只含有K个元素的大根堆,然后每次取一个元素与根比较,如果元素>=根,则直接抛弃,如果元素比根小,则插入这个大根堆,并剔除根元素并整理大根堆。
所有元素都比较完毕后,大根堆的根就是答案。
时间复杂度: