Cod sursa(job #1014150)

Utilizator stefyvoltFMI Stefan Niculae stefyvolt Data 22 octombrie 2013 10:47:26
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

int n, k, v[3000000];

void citire()
{
    cout << "n = "; cin >> n;
    cout << "k = "; cin >> k;

    for(int i=1; i<=n; i++)
    {
        cout << "v" << i << " = ";
        cin >> v[i];
    }
}

void afisare()
{
    cout << endl;
    for(int i=1; i<=n; i++)
        cout << v[i] << ' ';
    cout << endl;
}

int piv_aleat(int a, int b)             // generam un indice pseudo-aleator
{
    int p1, p2, p3, aux, mic, mare;     // defapt generam 3 indici si il alegem pe cel cu val mijlocie

    srand(time(NULL));                  // randomizam

    p1 = v[rand()%b + a];               // nr aleator din intervalul [a,b]
    p2 = v[rand()%b + a];
    p3 = v[rand()%b + a];

    aux = p1<p2 ? p1 : p2;              // min(p1,p2)
    mic = aux < p3 ? aux : p3;          // min( min(p1,p2) , p3)

    aux = p1>p2 ? p1 : p2;              // max(p1,p2)
    mare = aux > p3 ? aux : p3;         // max( max(p1,p2) , p3)

    return p1+p2+p3 - mic - mare;       // le adunam pe toate si le scadem pe cel mare si cel mic, ramanand mijlociul

}

void stat_de_ord(int a=1, int b=n)      // quicksort modificat
{
    int i=a, j=b, p=piv_aleat(a,b);     // v[i=a ... p ... j = b]

    while(i <= j)                       // cat timp i nu a ajuns la j
    {
        while(v[i] < p) i++;            // crestem i pana ajungem la pivot
        while(v[j] > p) j--;            // scadem j pana la pivot

        if(i <= j)                      // daca elementele la care ne-am oprit sunt de parti opuse ale pivotului
        {
            v[i] = v[i] + v[j] - (v[j] = v[i]); // le interschimbam valorile
            i++; j--;                   // si le lasam sa continue drumul
        }
    }

    if      (k <= j && a < j) stat_de_ord(a,j);        // apelam QS in subvectorul din stanga
    else if (k > j && i < b)  stat_de_ord(i,b);        // apelam QS in dreapta
}

int main()
{
    ifstream f ("sdo.in");
    ofstream g ("sdo.out");

    f >> n >> k;
    for(int i=1; i<=n; i++) f >> v[i];

    stat_de_ord();

    g << v[k];

    return 0;
}