求无序数组第K大的数

给出一个数组,要求查找出这个数组中按顺序排第K大的数字

思路一:
利用快排算法先将数组排序,然后在定位到第K个元素即可,算法复杂度为O(nlogn)
思路二:
利用快排和二分查找,先把数组分成两个部分,左边的比数轴pivot小,右边的比数轴pivot大。然后再比较pivot的位置和K的关系,如果比K大,那么第K个值就在pivot的左边,反之若比K小,则第K个值就在pivot的右边,若相等则直接返回。这种方法的复杂度要低一些。


代码如下:

int partition(int arr[], int low, int high)
{
	int pivot = arr[low];
	while(low < high)
	{
		while(low < high && arr[high] >= pivot)
		    high--;
        arr[low] = arr[high];
        while(low < high && arr[low] <= pivot)
            low++;
        arr[high] = arr[low];
	}
	arr[low] = pivot;
	return low;
}
int findKth(int arr[], int low, int high, int k)
{
    int kth;
	if(low == high) kth = arr[low];
	else
	{
		int pivot = arr[low];
		int splitPoint = partition(arr, low, high);
		if(k-1 == splitPoint)        //数组是从0开始的,所以比较时给K减了1
		    kth = pivot;
		else if(k-1 < splitPoint)
		        kth = findKth(arr, low, splitPoint-1, k);
        else if(k-1 > splitPoint)
                 kth = findKth(arr, splitPoint+1, high, k);
	}
	return kth;	
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值