如何在长度为n的数列中找到第k大的数

rt,首先自己思考了一下。维护一个n的大项堆,然后输出第k个根节点。当然也是自己很简单的一个思路(可能是因为最近比较爱堆排序吧)其实堆排序是比较适合文件量级很大的情况下,这样的效率比较快。比如后面文章提到的topk以及海量数据处理的面试。

(当然也需要记得做一些异常处理!比如说k>N的情况)

那么上网百度了一下。网上也给出了不同的答案。

1. 快速排序:从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:

1). Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;

2). Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n);

这样也需要思考一下,数列本就是无序的情况,快排的每一次分区可以判断第k大的数在分区的哪个位置

2. 建立堆排序,pop出第k个数

3. 用Merge Sort算法,整个算法复杂度为 O(NlgN), 然后找到第K个即可

4. select算法

你可能感兴趣的:(如何在长度为n的数列中找到第k大的数)