您的位置:首页 > 其它

找出数组中第K大的数

2015-09-30 20:09 267 查看
问题:找出数组中第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;
*/
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: