查找N个数中第K大的数

本文探讨了寻找数组中第K大数的多种方法,包括直接排序、开辟固定空间、快速排序变种等。重点介绍了利用快速排序思路,通过随机选择元素并分治的方式找到第K大数,该方法时间复杂度接近O(n)。此外,还提到了其他解法,如选择排序、二分查找、最大堆和最小堆维护等。
摘要由CSDN通过智能技术生成

如题,这个问题好像见过很多次了。印象对它很深刻。只是一直没有自己想出好办法。

今天做题目,仔细想了,有下面几个思路:

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/ar

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值