Pagini recente » Cod sursa (job #1555969) | Cod sursa (job #817412) | Cod sursa (job #1714947) | Cod sursa (job #2726480) | Cod sursa (job #2083128)
#include<bits/stdc++.h>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
int n;
void quicksort(vector<int>&v,int s,int d){
if (d-s<=0) return;
//pivot generat random, fiind medianul dintre 3 pivoturi random
int p1,p2,p3,pivot=0;
p1=rand()%(d-s+1) +s;
p2=rand()%(d-s+1) +s;
p3=rand()%(d-s+1) +s;
if( (v[p1]-v[p2]>0 && v[p1]-v[p3]<0) ||(v[p1]-v[p2]<0 && v[p1]-v[p3]>0) ) pivot=p1;
else if( (v[p2]-v[p1]>0 && v[p2]-v[p3]<0) ||(v[p2]-v[p1]<0 && v[p2]-v[p3]>0) ) pivot=p2;
else pivot=p3;
//un vector auxiliar pentru valorile < ca pivot si un deque pentru cele >=
vector<int>aux;
deque<int>q;
for(short int i=s;i<=d;++i) {
if(v[i]<v[pivot]) {
aux.push_back(v[i]);
}
else if(v[i]==v[pivot]) q.push_front(v[i]); //daca e egal il punem la inceput pentru a-l scoate primul
else
q.push_back(v[i]);
}
//next_d reprezinta pozitia unde a fost impartit in 2 vectorul
int next_d;
next_d=s+aux.size();
//copiem din aux si q in v
int siz=q.size();
for(int i=0;i<aux.size()+siz;++i){
if(i<aux.size())v[s+i]=aux[i];
else {v[s+i]=q.front();q.pop_front();}
}
//se apeleaza recursiv
quicksort(v,s,next_d);
if(next_d+1<d)
quicksort(v,next_d+1,d);
}
int main(){
srand(time(NULL));//pentru qsort
f>>n;
vector<int>v(n+1);
int k;f>>k;
for(int i=0;i<n;++i)
f>>v[i];
quicksort(v,0,n-1);
g<<v[k-1];
}