找出数组中第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、遍历完(一遍),即可找到随机选取的数是第几大的。
以上三步代码实现:
测试:
解法思路:
设数组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; */ }
相关文章推荐
- URAL - 1966 - Cycling Roads(并检查集合 + 判刑线相交)
- ocp-7
- 剑指offer—二进制中1的个数
- effective c++ 复制对象时勿忘每一个成分
- 实现只响应第一次按钮单击,第二次不响应
- 当数据类型为long的变量后面没有L加会有什么后果
- 意图(Intent)讲解1:安卓使用意图(Intent)通用方法传递数据
- 个人博客作业2--代码规范和代码复审
- DNS子域授权及view(三)
- 欢迎使用CSDN-markdown编辑器
- ocp-006
- grunt-contrib-cssmin使用指南
- 代码复审
- 冒泡、选择、插入排序的具体分析
- 代码规范及代码复审
- 触摸事件
- alpha to coverage
- Ubuntu 下一个 vim 建立python 周围环境 构造
- Grunt:任务自动管理工具(收藏+转载)
- 第三次作业-结对编程