Cod sursa(job #1263188)

Utilizator ml.vladareanVladarean Maria ml.vladarean Data 14 noiembrie 2014 00:36:07
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb

#include <stdio.h>
#include <stdlib.h>

void swap(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}

int partition(int a[], int left, int right, int pivotIndex) {
    int finalPivot = left;
    
    swap(a[right], a[pivotIndex]);
    for (int i = left; i < right; ++ i) {
        if (a[i] <= a[right]) {
            swap(a[finalPivot], a[i]);
            ++ finalPivot;
        }
    }
    swap(a[finalPivot], a[right]); // put pivot in its final place
    return finalPivot;
}

int select(int a[], int n, int k) {
    int tmpK = k;
    int left = 0;
    int right = n - 1;
    
    while (tmpK > 0) {
        int randPivot = left + ((right - left) >> 1);
        int tmpPosition = partition(a, left, right, randPivot);
        if ((tmpPosition - left + 1) == tmpK) { // we found the kth elt
            break;
        } else if ((tmpPosition - left + 1) < tmpK) {
            tmpK -= (tmpPosition - left + 1);
            left = tmpPosition + 1;
        } else {
            right = tmpPosition - 1;
        }
    }
    return a[left + tmpK - 1];
}

int main(int argc, const char * argv[]) {
    int n, k;
    
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
    
    scanf("%d%d", &n, &k);
    int a[n];
    for (int i = 0; i < n; ++ i) {
        scanf("%d", &a[i]);
    }
    printf("%d\n", select(a, n, k));
    fclose(stdout);
    fclose(stdin);

    return 0;
}