Cod sursa(job #407016)

Utilizator johnbBaranga Ionut johnb Data 1 martie 2010 23:11:55
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 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, lt_nr = 0, gt_nr = 0, *lt = NULL, *gt = NULL;
    
    do {
        int idx = rand() % n; 
        p = v[idx];    
        for (int i = 0; i < n; i++)
            if (v[i] < p)
               lt_nr++;
    }
    while (lt_nr == 0);
           
    if (lt_nr < k) {
       
       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;
    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;
}