找出数组中第K大的数

问题:找出数组中第K大的数(类似:找出一个数组中个数超过一半的数,就是找第n/2(n为数组长度)大的数)

解法思路:

设数组A[0,1.....n-1]

      1、随机选择数组中的一个数,将该数与A[n-1]交换

2、遍历数组,遇到比A[n-1]小的就依次放在数组的最前面(遍历到第一个比A[n-1]小的放在A[0],第二个比A[n-1]小的放在A[1]....)

3、遍历完(一遍),即可找到随机选取的数是第几大的。

以上三步代码实现:

//返回i,是值p[i]是数组中第i+1大的数
int random_partition(int *p, int n){
	int i = -1,j=0;
	int idx = rand() % n;
	swap(p[idx], p[n - 1]);
	for (j = 0; j < n; j++){
		if (p[j] < p[n - 1]){
			swap(p[++i],p[j]);
		}
	}
	swap(p[++i], p[n - 1]);
	return i;
}
4、已经找到第i+1大的数 ,剩下的就是拿i+1跟k比较

int getMaxK(int *p, int n, int k){
	int midx;
	if (k <= 0 || k > n)
		return -1;
	midx = random_partition(p,n);
	if (midx + 1 == k)
		return p[midx];
	else if (midx + 1>k)
		return getMaxK(p, midx + 1, k);
	else if (midx + 1 < k)
		return getMaxK(p+midx+1,n-midx-1,k-midx-1);
}

测试:

<pre name="code" class="cpp"><pre name="code" class="cpp">void main(){
	//找数组中个数大于一半的数
	int a[11] = {1,2,3,2,3,3,5,3,7,3,3};
	printArr(a,11);
	cout << findVal(a, 11) << endl;
	cout << getMaxK(a, 11, 11 / 2) << endl;

	//找数组中第K大的数
/*	int num, a[] = { 12012, 3, 945, 965, 66, 232, 65, 7, 8, 898, 56, 878, 170, 13, 5 };
	cout << getMaxK(a, 15, 2) << endl;
	cout << getMaxK(a, 15, 15) << endl;
	cout << getMaxK(a, 15, 14) << endl;
	*/
}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值