Cod sursa(job #2083147)

Utilizator VoineaAndreiVoinea Ioan-Andrei VoineaAndrei Data 7 decembrie 2017 04:55:21
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<bits/stdc++.h>
using namespace std;

ifstream f("sdo.in");
ofstream g("sdo.out");

int n,k;
    vector<long long>v(n+1);

int mediana (int i, int j,int k){
    if(((v[i]>=v[j])&&(v[i]<=v[k]))||((v[i]<=v[j])&&(v[i]>=v[k])))return i;
    if(((v[j]>=v[i])&&(v[j]<=v[k]))||((v[j]<=v[i])&&(v[j]>=v[k])))return j;
    else return k;
}

int quicksort(int s,int d,int poz){

    if (s==d) return v[s];

    //pivot generat random, fiind medianul dintre 3 pivoturi random
    int p1,p2,p3;
    p1=rand()%(d-s+1) +s;
    p2=rand()%(d-s+1) +s;
    p3=rand()%(d-s+1) +s;

    int poz_pivot=mediana(p1,p2,p3);
    long long pivot=v[poz_pivot];

    //impartim vectorul in doua in functie de pivot
    int i=s-1,j=d+1;
    while(i<j){
        while(v[++i]<pivot);
        while(v[--j]>pivot);
        if(i>=j)
            poz_pivot=j;
        else
                swap(v[i],v[j]);

    }
    //apelam recursiv functia pana cand vectorul e sortat
    if(poz+s-1<=poz_pivot)
        return quicksort(s,poz_pivot,poz);
    else
        return quicksort(poz_pivot+1,d, poz-poz_pivot+s-1);

}




int main(){

     srand(time(NULL));//pentru qsort

    f>>n>>k;


    for(int i=1;i<=n;++i)
        f>>v[i];


    g<<quicksort(1,n,k);
    return 0;

}