[置顶] 从一位数组中提取最小k个元素
#include <iostream> #include <cstdlib> #include <vector> using namespace std; /* * 从n个整型数组中提取前k个最小整数 * 方法一:利用快速排序进行递归划分 */ const int Max = 100; // 数组最大容量 class Solution { private: vector<int>array; // 输入的数组 vector<int>kmin; // 提取的k个最小值的数组 /* * 对数组进行划分,返回“中值”位置 */ int Adjust(vector<int>&arr, int low, int high) { int i, j; i = low; j = high; int tmp = arr[low]; while(i < j) { while(i < j && arr[j] > tmp) j--; if(i < j) arr[i++] = arr[j]; while(i < j && arr[i] < tmp) i++; if(i < j) arr[j--] = arr[i]; } arr[i] = tmp; return i; } /* * 利用上面的调整函数进行查找 */ void JustDoIt(vector<int>&arr, int low, int high, int k) { int i; int mid = Adjust(arr, low, high); static bool find; // 用于递归截断 /* * 找到解 */ if(!find && (mid + 1 == k || mid == k)) { find = true; for(i = 0;i < k;i++) { kmin.push_back(arr[i]); } return; } /* * 递归处理 */ else if(!find && k > mid + 1) { JustDoIt(arr, mid + 1, high, k); } else if(!find) { JustDoIt(arr, low, mid - 1, k); } } public: Solution(int n) { if(n < 0 || n>= Max) { cerr<<"参数不合法!"<<endl; exit(1); } int i; int e; for(i = 0;i < n;i++) { cout<<"请输入第"<<i<<"个整数:"; cin>>e; if(!cin.good()) exit(1); array.push_back(e); } } void JustDoIt(int k) { if(k <= 0 || k > array.size()) { cerr<<"参数不合法!"<<endl; exit(1); } JustDoIt(array, 0, array.size() - 1, k); } void show() { vector<int>::iterator it; for(it = kmin.begin(); it != kmin.end(); it++) { cout<<*it<<endl; } } }; void main() { Solution s(10); s.JustDoIt(3); s.show(); }