Cod sursa(job #2273938)

Utilizator mihaicivMihai Vlad mihaiciv Data 1 noiembrie 2018 10:05:48
Problema Statistici de ordine Scor 20
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int SDO(int, int, int, int*);
int getMiddle(int, int, int, int*);
int getMiddlePosition(int, int, int, int*);

int main() {

    FILE *f, *g;
    f = freopen("sdo.in", "r", stdin);
    g = freopen("sdo.out", "w", stdout);

    int n, k;

    scanf("%d %d", &n, &k);

    srand(time(NULL));

    int *v = malloc(n * sizeof(int));

    int i;
    for (i = 0; i < n; ++i) {
        scanf("%d", &v[i]);
    }

    printf("%d", SDO(0, n - 1, k - 1, v));

    return 0;
}

int SDO(int left, int right, int k, int *v) {

    int i = left;
    int j = right;
    //int rand1 = rand() % (right - left + 1) + left;
    //int rand2 = rand() % (right - left + 1) + left;
    //int rand3 = rand() % (right - left + 1) + left;
    //int pivot = getMiddle(rand1, rand2, rand3, v);
    //int pos = getMiddlePosition(rand1, rand2, rand3, v);

    int pivot = v[(left + right) / 2];
    int pos = (left + right) / 2;


    while (i <= j) {
        while (v[i] < pivot) {
            i ++;
        }
        while (v[j] > pivot) {
            j --;
        }
        if (i <= j) {
            if (i == pos) {
                pos = j; /// schimb pozitia unde se afla pivot
            } else if (j == pos) {
                pos = i;
            }
            int aux = v[i];
            v[i] = v[j];
            v[j] = aux;
            i ++;
            j --;
        }
    }


    if (pos == k) {
        return v[pos];
    } else if (pos < k) {
        return SDO(i, right, k, v);
    } else {
        return SDO(left, j, k, v);
    }



}

int getMiddle(int x, int y, int z, int *v) {

    if (v[x] <= v[y] && v[x] <= v[z]) {
        return ( (v[y] < v[z]) ? v[y]:v[z] );
    }
    if (v[y] <= v[x] && v[y] <= v[z]) {
        return ( (v[x] < v[z]) ? v[x]:v[z]);
    }
    if (v[z] <= v[x] && v[z] <= v[y]) {
        return ( (v[x] < v[y]) ? v[x]:v[y]  );
    }

}

int getMiddlePosition(int x, int y, int z, int *v) {

    if (v[x] <= v[y] && v[x] <= v[z]) {
        return ( (v[y] < v[z]) ? y:z );
    }
    if (v[y] <= v[x] && v[y] <= v[z]) {
        return ( (v[x] < v[z]) ? x:z );
    }
    if (v[z] <= v[x] && v[z] <= v[y]) {
        return ( (v[x] < v[y]) ? x:y  );
    }

}