Pagini recente » Cod sursa (job #2801634) | Cod sursa (job #1647100) | Cod sursa (job #2746813) | Cod sursa (job #1498459) | Cod sursa (job #2059978)
#include <iostream>
#include <fstream>
#define Nmax 3000002
#include <stdlib.h>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int k,ok,v[Nmax];
int pivotare (int s,int d,int v[])
{
int i,j,randpoz,randpiv;
randpoz=rand()% (d-s) +s;
randpiv=v[randpoz];
swap(v[d],v[randpoz]);
i=s-1;
for (j=s;j<d;j++)
if (v[j]<randpiv)
{i++;
swap(v[i],v[j]);
}
swap(v[i+1],v[d]);
return i+1;
}
void QS(int s,int d,int v[])
{
if (s<d)
{
int p=pivotare(s,d,v);
if (p==k) {fout<<v[k]<<" ";ok=1;return;}//daca pivotul a ajuns exact pe pozitia k il afisez
else if (k<p) //altfel daca pivotul e pe o pozitie mai mare decat k continui sa sortez doar in stanga, deoarece stiu ca elementele din dreapta sunt deja mai mari decat elementul cautat de mine
QS(s,p-1,v);
else
QS(p+1,d,v);// altfel sortez doar bucata din dreapta , analog cu cazul de mai sus
}
}
int main()
{
int n,i;
fin>>n>>k;
for (i=1;i<=n;i++)
fin>>v[i];
QS(1,n,v);
if (ok==0)
fout<<v[k];
return 0;
}