如何找出大小为n的数列中第k大的数?

 前几天面试吹牛说自己很擅长DS,结果被自摆一道,面试官问我如何在大小为n的数列中找出第k大的数?开始觉得不难,胡乱扯了几个方法,觉得很得意,结果回来后一想才发现答的差强人意,我竟然以为桶排序是bestsolution。。。于是开始怀疑自己智商。以后不能把话说的这么满。。。

google之,方法列于下:

 简单的解法比如用quicksort的思想,,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
           1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
           2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n);

如此递归下去。

 再有就是建立数列的最大堆,依次pop出k次即可。O(n * logk);

利用hash保存数组中元素Si出现的次数,利用基数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)。而桶排序虽然思想很妙,但在数子分布很散的情况下太过消耗空间,典型的用空间换时间,Not a good idea!

posted on 2011-05-04 12:08  徐豪  阅读(4181)  评论(0)    收藏  举报

导航