Cod sursa(job #1628310)

Utilizator Tzappy90Mihalache Constantin Tzappy90 Data 3 martie 2016 22:49:38
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <fstream>

typedef unsigned int uint;

void swap(uint *a, uint *b)
{
    if (*a == *b) {
        return;
    }
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}

int partition(uint *v, uint lower, uint upper)
{
    uint pivotIndex = lower + rand() % (upper - lower + 1);
    swap(&v[pivotIndex], &v[upper]);
    uint pivot = v[upper];
    uint i = lower;
    for (uint j = lower; j < upper; j++) {
        if (v[j] <= pivot) {
            swap(&v[j], &v[i++]);
        }
    }
    swap(&v[i], &v[upper]);
    return i;
}

uint find_kth_min(uint *v, uint lower, uint upper, uint k)
{
    uint p;
    do {
        p = partition(v, lower, upper);
        if (p < k) {
            lower = p + 1;
        } else {
            upper = p - 1;
        }
    } while (lower < upper);

    return v[k];
}

int main(void)
{
    srand(time(NULL));
    std::ifstream f("sdo.in");
    std::ofstream g("sdo.out");
    uint n, k;
    f >> n >> k;
    uint *v = new uint[n];
    for (uint i = 0; i < n; i++) {
        f >> v[i];
    }
    g << find_kth_min(v, 0, n - 1, k - 1) << '\n';
    delete[] v;
    f.close();
    g.close();
}