找出数组中第k大小的数

来源:互联网 发布:房地产库存数据 编辑:程序博客网 时间:2024/05/22 00:11

写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。

 

比较容易想到的是,找第k大的数:

第1大的数:需要遍历数组,找到排名第1的数

第2大的数:需要遍历数组,找到排名第1和第2的数

...

 

所以如果对空间没要求的话,可以用一个k大小的数组B保存最大的前k个元素。

遍历原数组,将元素插入到B中,就可以筛选出最大的前k个元素。

 

代码可以如下实现:

 

 

这个算法的时间复杂度为O(n*logk),空间负责度为O(k)。

 

那除了一个一个插入,还有其他的思路,其实我们前面的想法是保留前K个元素,还有种想法是去掉n-k个小的元素,而怎么能更快的

区分出一个数组中的大元素和小元素呢,可以想到快排中的partition

 

那我们有下面的算法:

将原数组分为2组,其中一组中元素>另一组元素,那如果大组的长度大于k,那第k个大的元素肯定在大组中,相反肯定在小组中,这样就缩短了搜索的长度。

 

 

可以看到,使用快排中的分区思想,平均每次可以缩短1/2,最差情况则是每次缩短1个元素。

这个算法的平均时间复杂度为O(logn),最差为O(n)。

 

原创粉丝点击