问题描述:
从[1, n] 这n个数中,找出最大的k个数,这就是经典的TopK问题。
示例:
从arr数组中,找出前4个最大的数。
解法1:局部排序
对arr进行k次的冒泡排序,每冒泡一次,得出最大值,一共冒泡k次。
时间复杂度:O( N * K)
解法2:整体排序
使用像快速排序这样的优秀的排序算法对arr整体进行排序。
时间复杂度: O( N * log2 N)
解法3:建堆
把arr数组建成一个大堆,堆顶元素为最大元素,将堆顶元素与数组最后元素交换,将最后元素不看做堆的一部分,再对交换后的堆进行调整算法,如此往复k次,数组后k个为升序的最大数。
时间复杂度:O(N + k *log2N)
解法3:建大小为k的堆
将数组arr前k个元素建成一个小堆。再将 arr[k,N] 的元素逐个与堆顶元素比较,如果大于堆顶元素就替换,再执行调整算法。替换完毕此时堆内元素就为最大的k个数。
当N非常大时,整个数组无法一次存入内存,这种解法就非常好用了。