寻找第k大或第k小的算法 -- 内存足够(C++实现)
2009-10-10 14:45
543 查看
内存足够的情况下,寻找第k大或第k小的算法
1:递归:
2:非递归:
1:递归:
template<class T> T select(T a[], int l, int r, int k) { //在a[l:r]中选择第k小的元素 if (l >= r) return a[l]; int i = l, // 从左至右的游标 j = r + 1; // 从右至左的游标 T pivot = a[l]; //把左侧>=pivot的元素与右侧<=pivot的元素进行交换 while (true) { do { i = i + 1; // 在左侧寻找>=pivot的元素 } while (a[i] < pivot); do { j = j - 1; // 在右侧寻找<=pivot的元素 } while (a[j] > pivot); if (i >= j) break; Swap(a[i], a[j]); } if (j - l + 1 == k) return pivot; a[l] = a[j]; a[j] = pivot; if (j - l + 1 < k) return select(a, j+1, r, k-j+l-1); else return select(a, l, j-1, k); } template<class T> T Select(T a[], int n, int k) { //返回a[0:n-1]中第k小的元素 //假定a 是一个伪最大元素 if (k < 1 || k > n) throw OutOfBounds(); return select(a, 0, n-1, k); }
2:非递归:
template<class T> T Select2(T a[], int n, int k) { //返回a[0:n-1]中第k小的元素 //假定a 是一个伪最大元素 if (k < 1 || k > n) throw OutOfBounds(); int l = 0; int r = n - 1; while (l < r) { int i = l, // 从左至右的游标 j = r + 1; // 从右至左的游标 T pivot = a[l]; //把左侧>=pivot的元素与右侧<=pivot的元素进行交换 while (true) { do { i = i + 1; // 在左侧寻找>=pivot的元素 } while (a[i] < pivot); do { j = j - 1; // 在右侧寻找<=pivot的元素 } while (a[j] > pivot); if (i >= j) break; Swap(a[i], a[j]); } if (j - l + 1 == k) return pivot; a[l] = a[j]; a[j] = pivot; if (j - l + 1 < k) { k -= j - l + 1; l = j + 1; } else { r = j - 1; } } return a[l]; }
相关文章推荐
- C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),C/C++实现
- Hoare选择算法 寻找第k小元素C实现 算法的“AWK脚手架和grap运行过程分析”
- 寻找字符串中首次出现的不重复字符算法与c++实现
- 【算法Ⅰ~Ⅳ(C++实现)】习题3.1 寻找int float double能表示的最大最小值
- C++实现的O(n)复杂度内查找第K大数算法示例
- 算法:C++实现O(n)复杂度内查找第K大数
- c++ 单例模式下实现内存自动回收或销毁
- 【转载】【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- 图像锐化算法 C++ 实现
- SIFT特征2-基于OpenCV和C++的算法实现
- 在图中寻找最短路径-----深度优先算法C++实现
- 快速傅里叶变换(FFT)算法C++实现代码
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- 算法代码实现之归并排序,C/C++实现,自顶向下与自底向上两种方式
- 常用算法的C++实现
- 算法思路重新实现-堆排序 中的 C++ & Java
- 数据结构复习:几种排序算法的C++实现和二叉树的相关算法实现
- 经典算法与数据结构的c++实现——shell排序算法
- [算法导论]2.2节编程练习C++实现