Pagini recente » Cod sursa (job #1926254) | Cod sursa (job #1127189) | Cod sursa (job #1024904) | Cod sursa (job #1687080) | Cod sursa (job #2613868)
#include <bits/stdc++.h>
std::ifstream fin("sdo.in");
std::ofstream fout("sdo.out");
int n, k;
std::vector <int> v;
int getPivot(std::vector<int> v)
{
std::vector < std::vector <int> > subliste;
std::vector <int> aux;
std::vector <int> mid;
if(v.size() <= 5)
{
sort(v.begin(), v.end());
return v[v.size() / 2];
}
int i = 0, j;
while(i < v.size())
{
for(j = i; j < i + 5; j++)
aux.push_back(v[j]);
sort(aux.begin(), aux.end());
subliste.push_back(aux);
i += 5;
}
for(i = 0; i < subliste.size(); i++)
mid.push_back(subliste[i][subliste[i].size()/2]);
return getPivot(mid);
}
int quickSelect(std::vector<int> v, int k)
{
std::vector <int> L;
std::vector <int> E;
std::vector <int> G;
int pivot = getPivot(v);
for(int i = 0; i < v.size(); i ++)
if(v[i] < pivot)
L.push_back(v[i]);
else if(v[i] == pivot)
E.push_back(v[i]);
else
G.push_back(v[i]);
if(k <= L.size())
return quickSelect(L, k);
else if(k <= L.size() + E.size())
return E[0];
else
return quickSelect(G, k - L.size() - E.size());
}
int main()
{
int i, val;
fin >> n >> k;
for(i = 0; i < n; i++)
{
fin >> val;
v.push_back(val);
}
fout << quickSelect(v, k);
return 0;
}