Cod sursa(job #2061206)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 8 noiembrie 2017 23:20:29
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define dmx 3000000

int v[dmx];

int prt(int lo, int hi)
{
    int i,j,x,aux;

    x=lo+(rand()%(hi-lo+1));
    aux=v[x];
    v[x]=v[lo];
    v[lo]=aux;

    x=v[lo];
    i=lo-1;
    j=hi+1;
    while (true)
    {
        do
        {
            i++;
        }
        while(v[i] < x);
        do
        {
            j--;
        }
        while(v[j] > x);
        if (i < j)
        {
            aux=v[i];
            v[i]=v[j];
            v[j]=aux;
        }
        else
            return j;
    }

}

void qselect(int lo, int hi, int k)
{
    int p,lg;

    if (lo == hi)
        return;

    p=prt(lo,hi);
    lg=p-lo+1;///in lg tin minte cate elemente am in subvectorul stang
    if (k <= lg)
        qselect(lo,p,k);
    else
        qselect(p+1,hi,k-lg);

}

int main()
{
    FILE *f;
    int n,k,i;

    f=fopen("sdo.in","r");
    fscanf(f,"%d%d",&n,&k);
    for (i=0; i<n; i++)
        fscanf(f,"%d",&v[i]);
    fclose(f);

    srand(time(NULL));
    qselect(0,n-1,k-1);

    f=fopen("sdo.out","w");
    fprintf(f,"%d",v[k-1]);
    fclose(f);

}