找最小的第k个数 k min (Selection Algorithm 与 Median of Medians Algorithm)

这篇博客介绍了如何在无序数组中寻找第k小的数,比较了排序、多次查找、Partition算法和Median of Medians算法。Partition算法平均时间复杂度为O(nlogk),而Median of Medians算法最差时间复杂度为O(n)。文中还给出了算法的具体实现和相关参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目很简单:要求一个算法能在一个长度为n的无序数组中找到第k小的数(k从0开始)

例如:4, 1, 2, 5 序列的第2小的数应该是4. 因为原数列排序后为1,2,4,5 所以第0小的数是1,第1小的数是2,第2小的数是4,第3小的数是5.


解法:

1)排序:

最容易想到的解法就是先把整个数组从小到大排序一遍,然后想要找哪一个数从头开始找即可。这种解法时间复杂度:O(nlogn)


2)多次查找:

第一遍遍历先找到最小的值,并标记为已访问过。第二遍再找剩下没访问过的最小值,即第二小的数。。。这样遍历k轮就能找到第k小的数。时间复杂度:O(n*k)


3)Partition算法:

Partition算法是快速排序QuickSort中的一部分,思想是选定一个值作为pivot,然后通过swap,使得最终pivot左边的数都小于pivot,pivot右边的数都大于pivot。

利用Partition算法,再结合递归,类似二分查找的分治。

即:返回pivot的index正好和k相等,则找到了第k小的数。

如果返回pivot的index小于k,则在pivot的右半段递归查找。

如果返回pivot的index大于k,则在pivot的做半段递归查找。


时间复杂度:平均:O(nlogk) 优于排序解法,但最差时(如:递减数列时)退化成 O(n^2)

具体实现看下面代码。。。


一些写的不错的文章:

http://algorithmsandme.blogspot.com/2013/08/find-kth-smallest-element-application.html


4)Median of Medians 算法:最差:O(n)

1. Divide the array into N/C columns of elements, for small odd C.
2. Find the median of each column by sorting it.
3. Take only the medians and repeat steps 1-2 recursively until only one value remains. That value is picked as the pivot.
4. Iterate through the array and count number of elements strictly smaller than the pivot (S), larger than the pivot (L) and equal to the pivot (E=N-S-L).
5. If K<S, move all

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值