Cod sursa(job #1080442)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 12 ianuarie 2014 15:23:08
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <utility>

int parts(int *Arr, int left, int right, int pi) {
    int index = left;
    std::swap(Arr[pi], Arr[right]);
    for(int i = left; i < right; i++) {
        if(Arr[right] > Arr[i]) {
            std::swap(Arr[index], Arr[i]);
            index++;
        }
    }
    std::swap(Arr[index], Arr[right]);
    return index;
}

int qsel(int *Arr, int left, int right, int k) {
    if(right == left) {
        return Arr[left];
    }
    int pi = left + rand() % (right - left);
    int npi = parts(Arr, left, right, pi);
    int dist = npi - left + 1;
    if(dist == k) {
        return Arr[npi];
    } else if(k < dist) {
        return qsel(Arr, left, npi - 1, k);
    } else {
        return qsel(Arr, npi + 1, right, k - dist);
    }
}

int main() {
    srand(time(NULL));
    std::ifstream in("sdo.in");
    std::ofstream out("sdo.out");
    int nV, k;
    in >> nV >> k;
    int *Arr = new int[nV];
    for(int i = 0; i < nV; i++) {
        in >> Arr[i];
    }
    out << qsel(Arr, 0, nV - 1, k);
    return 0;
}