#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();
}
#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;
/*
* 从n个整型数组中提取前k个最小整数
* 方法二:利用小根堆
*/
const int Max = 100; // 数组最大容量
class Solution {
private:
vector<int>array; // 输入的数组
vector<int>kmin; // 提取的k个最小值的数组
/*
* 堆调整
*/
void AjustHeap(vector<int>&arr, int i, int n) {
int j;
int tmp;
tmp = arr[i];
while(i < n) {
j = 2 * i + 1;
if(j >= n) break;
if(j < n - 1 && arr[j] > arr[j + 1]) {
j++;
}
if(tmp < arr[j]) break;
arr[i] = arr[j];
i = j;
}
arr[i] = tmp;
}
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 CreateHeap(int n) {
int i;
for(i = n/2 - 1;i >= 0;i--) {
AjustHeap(array, i, n);
}
// copy(array.begin(), array.end(), ostream_iterator<int>(cout," "));
// cout<<"---"<<endl;
}
void JustDoIt(int k) {
if(k <= 0 || k > array.size()) {
cerr<<"参数不合法!"<<endl;
exit(1);
}
int i;
int n;
for(i = 0;i < k;i++) {
n = array.size() - i;
CreateHeap(n);
// copy(array.begin(), array.end(), ostream_iterator<int>(cout," "));
swap(array[0],array[n-1]);
}
vector<int>::iterator it = array.end() - 1;
for(i = 0;i < k;i++) {
kmin.push_back(*it--);
}
}
void show() {
vector<int>::iterator it;
for(it = kmin.begin(); it != kmin.end(); it++) {
cout<<*it<<endl;
}
}
};
void main() {
Solution s(3);
s.JustDoIt(3);
s.show();
}