Cod sursa(job #2276544)

Utilizator IordachescuAncaFMI Iordachescu Anca Mihaela IordachescuAnca Data 4 noiembrie 2018 20:34:31
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<random>
#include<ctime>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int partitie(int a[], int st, int dr)
{
    int ra=st+rand()%(dr-st+1);
    int rb=st+rand()%(dr-st+1);
    int rc=st+rand()%(dr-st+1);
    if(a[ra]>a[rb])
    {
        swap(ra,rb);
    }
    if(a[ra]>a[rc])
    {
        swap(ra,rc);
    }
    if(a[rb]>a[rc])
    {
        swap(rb,rc);
    }
    int poz=rb;
    swap(a[dr],a[poz]);
    int pivot=a[dr];
    int i=st-1;
    int j=dr+1;
    while(true)
    {
        do
        {
            i++;
        }
        while(a[i]<pivot);
        do
        {
            j--;
        }
        while(a[j]>pivot);
        if(i>=j)
        {
            return j;
        }
        swap(a[i],a[j]);
    }
}
int qs(int a[], int st, int dr, int k)
{
    if(st<dr)
    {
        int piv=partitie(a,st,dr);
        if(piv==k)
        {
            return a[k];
        }
        if(piv<k)
        {
            qs(a,piv+1,dr,k);
        }
        else
        {
            qs(a,st,piv-1,k);
        }
    }
}
int n,k,i,a[3000004];
int main()
{
    fin>>n>>k;
    for(i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    srand(time(NULL));
    fout<<qs(a,1,n,k);
    fin.close();
    fout.close();
    return 0;
}