转载请提供原创链接 http://blog.youkuaiyun.com/shuiziliu1025/article/details/50958241
题目: 给出 N 个整数(N可能很大,以致无法装入内存),找出前 K 个最大的整数
【解法一】
如果 N 的数量不是很大,例如在几千个左右,则在这种情况下,那我们就先排序一下,这里快速排序或者推排序都是很好的解决方案,平均时间复杂度为 O(N * log2N)。然后取出前 K 个,O(K)。总共时间复杂度 O(N * log2N)+ O(K) = O(N * log2N)。
当 K = 1时,上面的算法也是 O(N * log2N)的复杂度,而显然我们可以通过 N-1次的比较和交换得到结果。题目要求求出最大的 K 个数,并不需要前 K 个元素有序,后 N-K 个元素有序。
如何避免元素的排序,可以使用部分排序的算法,例如选择排序和冒泡排序。把 N 个数中的前 K 大个数排序,复杂度是O(N*K)
这两种复杂度哪一种更好,则取决于 K 的大小, 在 K (K < = log2N)较小的情况下,可以选择部分排序。
【解法二】
回忆一下快速排序,快排中的每一步,都是将待排数据分做两组,其中一组的数据的任何一个数都比另一组中的任何一个大,然后再对两组分别做类似的操作,然后继续下去在本问题中,假设 N 个数存储在数组 S 中,我们从数组 S 中随机找出元素 X,把数组分为两部分 Sa 和 Sb。Sa中的元