#include <iostream>
#include <vector>
using namespace std;
class IthMin {
private:
vector<int> vec;
int ithMin;
public:
void init();
bool getIthMin(int k, int p, int r);
int partition(int p, int r);
void traverse();
void swap(int i, int j);
inline int getSize() {
return vec.size();
}
inline int getithMin() {
return vec.at(ithMin);
}
};
void IthMin::swap(int i, int j) {
if (i != j) {
int temp = vec.at(i);
vec.at(i) = vec.at(j);
vec.at(j) = temp;
}
}
int IthMin::partition(int p, int r) {
int value = vec.at(r);
int i = p-1;
int j = p;
for (; j <= r-1; j++) { // 判断等号不要忘
if (vec.at(j) <= value) {
i++;
swap(i, j);
}
}
swap(++i, j); // ++需要放前面
return i;
}
bool IthMin::getIthMin(int k, int p, int r) {
if (k < 1 && k > (int)vec.size()) {
return false;
} else {
ithMin = partition(p, r);
if (ithMin > k-1) {
getIthMin(k, p, ithMin-1);
} else if (ithMin < k-1) {
getIthMin(k, ithMin+1, r);
}
return true;
}
}
void IthMin::init() {
std::cout << "how many elements do you want to enter:";
int count;
std::cin >> count;
int element;
for (int i = 0; i < count; i++) {
std::cin >> element;
vec.push_back(element);
}
}
void IthMin::traverse() {
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) {
std::cout << *iter << " ";
}
std::cout << std::endl;
}
int main() {
IthMin *im = new IthMin();
im->init();
//im->traverse();
if (im->getIthMin(5, 0, im->getSize()-1)) {
std::cout << im->getithMin();
}
delete im;
return 0;
}
输入:7
2 7 5 1 9 8 4