Cod sursa(job #2064663)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 12 noiembrie 2017 17:41:05
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
#include <cstdlib>
using namespace std;

int k,n,v[500010];

void swap(int &a,int &b)
{
    int aux;
    aux = a;
    a = b;
    b = aux;
}

int part_Hoare(int st, int dr)
{
    int pivot = v[st + (rand() % (dr - st + 1) + rand() % (dr-st+1) + rand()%(dr-st+1))/3];
    int i =  st-1,j = dr + 1;

    while(1)
    {
        do{
            i++;
        }while(v[i] < pivot);

        do{
            j--;
        }while(v[j] > pivot);
        if(i>=j)
            return j;

        swap(v[i],v[j]);
    }
}

void qsort(int st,int dr)
{
    if(st < dr)
    {
        int p = part_Hoare(st,dr);
        if(p==k) return;
        if(p > k) qsort(st,p);
        else qsort(p+1,dr);
    }
}

int main()
{
    int i;
    freopen("sdo.in","r",stdin);
    freopen("sdo.out","w",stdout);

    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        scanf("%d",v+i);

    qsort(1,n);
    printf("%d",v[k]);
}