Cod sursa(job #2083134)

Utilizator VoineaAndreiVoinea Ioan-Andrei VoineaAndrei Data 7 decembrie 2017 04:12:26
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#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];

}