Pagini recente » Cod sursa (job #3186359) | Cod sursa (job #415328) | Cod sursa (job #1989939) | Cod sursa (job #2857882) | Cod sursa (job #2083134)
#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;
cout<<s<<" si "<<d<<" pivot:"<<pivot<<'\n';
//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 full_size=aux.size()+q.size();
int aux_size=aux.size();
aux.resize(aux.size()+5);
for(int i=0;i<full_size;++i){
if(i<aux_size)v[s+i]=aux[i];
else {v[s+i]=q.front();q.pop_front();}
}
//se apeleaza recursiv
if(s<n&&next_d<n)
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+10);
int k;f>>k;
for(int i=0;i<n;++i)
f>>v[i];
quicksort(v,0,n-1);
g<<v[k-1];
}