Cod sursa(job #3162406)

Utilizator sorinturdaSorin Turda sorinturda Data 29 octombrie 2023 10:04:07
Problema Statistici de ordine Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include <time.h>

void swap(int *a, int *b){
    int aux=*a;
    *a=*b;
    *b=aux;
}

int partition(int a[], int left, int right) {
    int pivot = rand() % (right - left + 1) + left;
    int x = a[pivot];
    swap(&a[right], &a[pivot]);
    int i = left - 1;
    for (int j = left; j <= right - 1; j++)
        if (a[j] <= x)
            swap(&a[++i], &a[j]);
    swap(&a[i + 1], &a[right]);
    return i + 1;
}

int quickselect(int a[], int left, int right, int k) {
    int index = partition(a, left, right);
    if (k == index)
        return a[k];
    else if (k < index)
        return quickselect(a, left, index - 1, k);
    return quickselect(a, index + 1, right, k);
}

int main() {
    srand(time(NULL));
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
    int n, k;
    scanf("%d %d ", &n, &k);
    int a[n];
    for (int i = 0; i < n; i++)
        scanf("%d ", &a[i]);
    printf("%d\n", quickselect(a, 0, n - 1, k-1));
    return 0;
}