寻找数组中第k小的数:平均情况下时间复杂度为O(n)的快速选择算法

本文介绍了一种平均时间复杂度为O(n)的快速选择算法——线性选择算法。通过详细解释算法步骤,包括选择中枢、一次快速排序及比较中枢位置与目标值,帮助读者理解并实现该算法。

又叫线性选择算法,这是一种平均情况下时间复杂度为O(n)的快速选择算法,用到的是快速排序中的第一步,将第一个数作为中枢,使大于它的所有数放到它右边,小于它的所有数放到它左边。之后比较该中枢的最后位置i与k的大小,若i比k小,说明第k小的元素在i的右半段,之后对i的右半段进行快速选择;若i比k大,说明第k小的元素在i的左半段,之后对i的左半段进行快速选择;若i正好等于k,则直接返回......。

下面是具体的算法步骤:

1,选择中枢:如下,为了提高快速选择的效率,最好尽可能的选择数值居中的数作为中枢。如1 7 2 8 4 3,则取头尾以及中间位置,然后选择(1, 2, 3)中的2

int median3(int nums[], int left, int right){
	int center = (left + right) / 2;
	if(nums[left] > nums[center])
		swap(nums[left], nums[center]);
	if(nums[left] > nums[right])
		swap(nums[left], nums[right]);
	if(nums[center] > nums[right])
		swap(nums[center], nums[right]);//此时nums[left] <= nums[center] <= nums[right]
	swap(nums[center], nums[right-1]);//交换中枢和a[right-1],此时上面三个值的居中的数在下标right-1处,然后返回中枢,由于a[right]必定比中枢大,故只需对区间[le
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值