Cod sursa(job #1871068)

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

int v[NMAX], n, k;

int Divide(int p, int q)
{
    int left = p, right = q, pivot = v[p + (rand() % (q-p+1))], aux;
    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;
}

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

int main()
{
    int i, nr;
    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(NULL));
    nr = QuickSelect(0,n-1);
    fprintf(fout,"%d\n",nr);
    fclose(fout);
    return 0;
}