Cod sursa(job #1871104)

Utilizator Horia14Horia Banciu Horia14 Data 7 februarie 2017 10:20:15
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#define NMAX 3000002
using namespace std;

int v[NMAX], n, k;

int Divide(int p, int q)
{
    int left = p, right = q,aux;
    int pivot = v[p + rand()%(q-p+1)];
    while(left < right)
    {
        while(v[left] < pivot) left++;
        while(v[right] > pivot) right--;
        if(left < right)
        {
            aux = v[left];
            v[left] = v[right];
            v[right] = aux;
        }
    }
    return left;
}

void QuickSelect(int left, int right)
{
    int mid = Divide(left,right);
    if(mid == k-1)return;
    if(mid < k-1) QuickSelect(mid+1,right);
    else QuickSelect(left,mid-1);
}

int main()
{
    int i;
    FILE *fin, *fout;
    fin = fopen("sdo.in","r");
    fout = fopen("sdo.out","w");
    fscanf(fin,"%d%d",&n,&k);
    for(i=0; i<n; i++)
        fscanf(fin,"%d",&v[i]);
    fclose(fin);
    srand(time(0));
    QuickSelect(0,n-1);
    fprintf(fout,"%d\n",v[k-1]);
    fclose(fout);
    return 0;
}