Cod sursa(job #407011)

Utilizator johnbBaranga Ionut johnb Data 1 martie 2010 23:05:58
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>


int kth_elem(int* & v, short n, short k) {

    // pt k == 1, nr cautat este minimul vectorului 
    if (k == 1) {
       int r = v[0];
       for (int i = 1; i < n; i++)
           if (v[i] < r)
              r = v[i];
       return r;
    }        
    
    int p = v[rand() % n]; // alegere pivot aleator
    int lt_nr = 0, gt_nr = 0, *lt = NULL, *gt = NULL;
    
    for (int i = 0; i < n; i++)
        if (v[i] < p)
           lt_nr++;

    if (lt_nr < k && lt_nr != 0) {
       
       gt = new int[n - lt_nr];
       for (int i = 0; i < n; i++)
           if (v[i] >= p)
              gt[gt_nr++] = v[i];
        free(v);
       return kth_elem(gt, gt_nr, k - lt_nr);
    }
    
    else {
         lt = new int[lt_nr];
         lt_nr = 0;
         for (int i = 0; i < n; i++)
             if (v[i] < p)
                lt[lt_nr++] = v[i];
         free(v);
         return kth_elem(lt, lt_nr, k);
    }
   
}
    


int main() {
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
    int k, n;
    int *v, r, tmp;
    scanf("%d %d", &n, &k);
    v = new int[n]; 
    for (int i = 0; i < n; i++)
        scanf("%d", v++);
    v -= n;
    printf("%d\n", kth_elem(v, n, k));
    return 0;
}