如题,这个问题好像见过很多次了。印象对它很深刻。只是一直没有自己想出好办法。
今天做题目,仔细想了,有下面几个思路:
1. 直接排序,然后再遍历,这是最自然的方法,当然也是最笨的,时间效果不好;
2.开辟一个K大小的空间,存储了后排序,然后把其他身下的一个个对比,这样也可以得到第k大的数,效果好一点,不够如果k=N那么就退化了,而且增加了内存开销;
3.后来想到,K的大小问题,于是有快速排序,排K次,也是比较傻的方法;
4.然后想到一个借助快速排序思路的方法,
选择一个随机的数A1,进行一次快排,那大于A1的数在右边K1个,小于A1的数在左边K2个;
对比K,K1,如果K>K1,说明第K大的数在K2那堆中,否则就在K1这堆中(如果K刚刚等于K1那就是第K大的数了);
然后在K1堆或者K2堆中继续随机选择,而对比的位数就变化了,如果是K1堆 则继续为K,如果是K2堆,则为K-K1.
自己写一遍,以后就能代码伪代码都能写了。
查过百度,有大神总结了方法,不献丑了。
我的方法和解法三相似。
http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html
所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。
解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。