Cod sursa(job #857884)

Utilizator TripluYOlteanu Costin TripluY Data 18 ianuarie 2013 13:51:01
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

int *vector_citit;

int partitionare(int stanga,int dreapta)
{
    int pivot = vector_citit[stanga + rand()%(dreapta - stanga +1)];
    if(stanga >= dreapta)
        return 0;
    do
    {
        while(vector_citit[stanga] < pivot)
            ++stanga;
        while(vector_citit[dreapta] > pivot)
            --dreapta;
        if(stanga < dreapta)
            {swap(vector_citit[stanga],vector_citit[dreapta]);
            ++stanga;
            --dreapta;}
        else
            return dreapta;
    }
    while(stanga < dreapta);
    return 0;
}

void selecteaza(int stanga,int dreapta,int k)
{
    if(stanga == dreapta)
        return;
    int poz = partitionare(stanga, dreapta), poz_ult = poz-stanga+1;
    if(poz_ult >= k)
        selecteaza(stanga,poz,k);
    else
        selecteaza(++stanga,dreapta,k-poz_ult);
}

int main()
{
    srand(time(NULL));
    int n,k;
    ifstream f("sdo.in");
    f >> n >> k;
    vector_citit = new int[n];
    --n;
    for(int i=0;i<=n;++i)
        f>>vector_citit[i];
        f.close();
    selecteaza(0,n,k);
    ofstream g("sdo.out");
    g<<vector_citit[k];
    g.close();
    return 0;
}