Quick Select in C++
Quickselect with std::vector
#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
void swap(vector<int>& list, int l, int r)
{
if (l == r) return;
int t= list[l];
list[l]= list[r];
list[r]= t;
}
void median3(vector<int>& list, int l, int r)
{
if (l == r) return;
int m= (l+r)/2;
if (list[l] > list[r]) swap(list, l, r); // r has bigger number
if (list[m] > list[r]) return; // r is the median of 3
else
{
if (list[l] > list[m]) swap(list, l, r);
else swap(list, m, r);
}
}
int select_k(vector<int>& list, int l, int r, int k)
{
if (l == r)
{
assert(l == k);
return list[l];
}
median3(list, l, r);
int i= l;
int j= r-1;
while (i <= j)
{
while (i <= j && list[i] <= list[r]) i++; // left will include values less than or equal to pivot
while (i <= j && list[j] > list[r]) j--;
if (i < j)
{
swap(list, i, j);
i++; j--;
}
}
if (list[i] > list[r])
{
swap(list, i, r);
if (i == k) return list[i];
else if (k < i) return select_k(list, l, i-1, k);
else return select_k(list, i+1, r, k);
}
else
{
if (r == k) return list[r];
else return select_k(list, l, r-1, k);
}
}
int select_k(vector<int>& list, int k)
{
int val= select_k(list, 0, list.size()-1, k);
return val;
}
int main()
{
vector<int> list;
for (int i= 0; i < 10; ++i)
{
int val= i*2%3;
cout << val << " ";
list.push_back(val);
}
cout << endl;
for (int k= 0; k < 10; ++k) cout << k << ": " << select_k(list, k) << endl;
//cout << "6: " << select_k(list, 6) << endl;
return 0;
}