求数组中最大的K个数
来源:互联网 发布:php自定义config 编辑:程序博客网 时间:2024/06/04 18:14
这里我用了编程之美里面的思路,把书中的第二和第四第五三种方法的代码写了一遍。
下面分别是三种方法的代码和书中的思路对照。
代码如下测试的main函数代码放到最后面来写。
/************************************************************************//* 编程之美的题目:2.5寻找最大的K个数解法二:*//************************************************************************/template<class Item>void swap1(Item &rhs, Item &lhs){Item tmp = rhs;rhs = lhs;lhs = tmp;}/**快速排序的分割算法*/template<class Item>int partition(Item a[], int l, int r){int compare = a[l];int left = l, right = r;while(left < right){while(left < right && a[right] >= compare) right--;swap1(a[right], a[left]);while(left < right && a[left] <= compare) left++;swap1(a[right], a[left]);}return left;}*找出最大的K个数*/template<class Item>int KBig(Item a[], int l, int r, const int k){if((r - l) < k || k <= 0) return -1;int p = partition(a, l, r);if((p - l) > k) return KBig(a, l, p, k);else if((p - l) <= k) return KBig(a, p + 1, r, k - (p - l));}
第四种解法:
/* 编程之美的题目:2.5寻找最大的K个数 解法四:先用堆排序把K个数排序,然后依次取数据查到堆中。 */ /************************************************************************/ template<class Item> void HeapAjust(Item *pNumber, int i, int length) { if(pNumber == NULL || length <= 0) return; int k = i; while((2 * k + 1 < length)) { int child = 2 * k + 1; if((child +1) < length && (pNumber[child] < pNumber[child + 1])) child++; if(pNumber[k] < pNumber[child]) swap1(pNumber[k], pNumber[child]); k = child; } } /*上面一个函数式创建大顶堆,这个是相反的创建小顶堆,当然两个函数也可以写成一个函数*/ template<class Item> void HeapAjustSmall(Item *pNumber, int i, int length) { if(pNumber == NULL || length <= 0) return; int k = i; while((2 * k + 1 < length)) { int child = 2 * k + 1; if((child +1) < length && (pNumber[child] > pNumber[child + 1])) child++; if(pNumber[k] > pNumber[child]) swap1(pNumber[k], pNumber[child]); k = child; } } template<typename Item> void KBig(Item *pNumber, int k, int length) { if(pNumber == NULL || k >= length || length < 2) return; Item *pK = new Item[k]; int i =0; while(i < k) { pK[i++] = pNumber[i]; // i++; } for(i = k / 2 - 1; i >= 0; --i) { HeapAjustSmall(pK, i, k); } for(i = k; i < length; ++i) { if(pNumber[i] > pK[0]) swap1(pNumber[i], pK[0]); HeapAjustSmall(pK, 0, k); } for(i = 0; i < k; ++i) cout<<pK[i]<<endl; }
- 求数组中最大的k个数
- 求数组中最大的K个数
- 求数组的最大K个数
- 寻找数组中最大的K个数
- 求数组中最小的k个数
- 基于快速排序思想求,数组最大的k个数,数组中出现次数超过一半的数,数组中最大的k个数
- 求n个数中最大的k个数
- 求一个数组的最大k个数(java)
- 求数组中最小的k个数以及海量数据最大堆、multiset解决方案
- N个数求最大的k个数
- 四.求一组数据中最大的K个数
- 利用MapReduce求海量数据中最大的K个数
- 用堆排序寻找数组中最大的K个数
- 在无序数组中取最大的K个数
- Arithmetic problem | 从数组选K个数位于原数组相对位置,求K个数的最大数
- 算法之求数组中最小的K个数
- 算法题:求数组中最小的k个数
- 面试30 求数组中最小的k个数
- 职业心态与职业生涯规划
- fefora安装firefox
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- 如何添加iis默认文档?
- Fedora 8下常用应用软件的安装方法
- 求数组中最大的K个数
- 用指针 数组连接
- POJ 2778 DNA Sequence AC自动机 矩阵加速DP
- VS2005环境下用WinCE6.0自制模拟器(一)
- ubuntu 10.04源 更新源列表
- 指针 数组 复制
- 我的第一个Visual ModelQ的仿真图
- uva11461
- nginx 禁止某个IP访问站点