Pagini recente » Cod sursa (job #360434) | Cod sursa (job #2828026) | Cod sursa (job #3349181) | Cod sursa (job #818112) | Cod sursa (job #3315355)
#include <fstream>
#include <cstdlib>
#define NMAX 30000002
using namespace std;
ifstream fin ("sdo.in");
ofstream fout("sdo.out");
int n, k;
long long int a[NMAX];
long long int qselect(int st, int dr);
int Divide(int st, int dr);
int main()
{
int i;
fin>>n>>k;
for(i = 1; i <= n ;i++)
fin>>a[i];
srand(1023);
fout<<qselect(1, n)<<'\n';
return 0;
}
long long int qselect(int st, int dr)
{
if (st <= dr)
{
int poz = Divide(st, dr);
if(poz == k)
{return a[poz];}
else
if(k > poz)
return qselect(poz + 1, dr);
return qselect(st, poz - 1);
//excludem poz pentru ca aceea este pozitia pivotului(corecta in vectorul mare)
}
}
int Divide(int st, int dr)
{
long long int pivot;
int poz;
poz = st + rand()%(dr - st + 1);
pivot = a[st]; a[st] = a[poz]; a[poz] = pivot;
pivot = a[st];
while(st < dr)
{//initial am liber la stanga, deci caut un element in dreapta care trebuie mutat
while(st < dr && a[dr] >= pivot)
dr--;
//mut elementul din dreapta la stanga
a[st] = a[dr];
//am liber la dreapta, deci caut in stanga un element care trebuie mutat
while(st < dr && a[st] <= pivot)
st++;
//mut elementul din stanga la dreapta
a[dr] = a[st];
}
a[st] = pivot;
return st;
}