# Selection 演算法
- [215. Kth Largest Element in an Array](https://leetcode.com/problems/kth-largest-element-in-an-array/)
- 以 median of median 當作 pivot
```c++=
// return the kth smallest number in data
int selection(vector<int> data, int k){
int n = data.size();
if(n<=10){
sort(data.begin(),data.end());
return data[k-1];
}
vector<int> median;
for(int i=0;i+5<=n;i+=5){
sort(data.begin()+i, data.begin()+i+5);
median.push_back(data[i+2]);
}
int mom = selection(median, median.size()/2);
vector<int> a, b;
for(auto &d : data){
if(d<mom) a.push_back(d);
else if(d>mom) b.push_back(d);
}
int less = a.size(), equal = n - a.size() - b.size();
if(less >= k) return selection(a, k);
else if(less + equal >= k) return mom;
else return selection(b, k-less-equal);
}
```