Cod sursa(job #1283917)

Utilizator thinkphpAdrian Statescu thinkphp Data 6 decembrie 2014 07:36:22
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.56 kb
/**
 *   Description: Order statistic
 *   Author     : Adrian Statescu <[email protected]>.
 *   License    : MIT
 *   Feel free to use and distribute as long as this note is kept.
 */
 
#include <stdio.h>
#define FIN "sdo.in"
#define FOUT "sdo.out"
#define MAXN 3000005

typedef unsigned int uint;

uint vec[ MAXN ];

//function prototypes
int nth_element(int vec[],int,int);
void nth_element_helper(int vec[],int,int,int);
void swap(int*,int*);

int main() {

    uint n,
         i,
         k;

     FILE *fin = fopen(FIN, "r");

     fscanf(fin, "%d%d", &n, &k);   

     k--;

     for(i = 0; i < n; i++) fscanf(fin, "%d", &vec[ i ]);

     fclose( fin );

     FILE *fout = fopen(FOUT, "w");

     fprintf(fout, "%d", nth_element(vec, n, k));     

     fclose( fout );

     return(0);
};

void swap(int *a,int *b) {

     int aux;

         aux = *a;

         *a = *b;

         *b = aux;  
};

void nth_element_helper(int vec[], int left, int right, int k) {

    int i = left, 

        j = right,

        pivot = vec[ (left + right) >> 1 ];

    while(i <= j ) {

          while( vec[ i ] < pivot ) i++; 

          while( vec[ j ] > pivot ) j--;

          if( i <= j ) swap(vec + i, vec + j), i++, j--;
    }

    if(left < j && k <= j) nth_element_helper(vec, left, j, k);    

    else 

    if(i < right && k >= i) nth_element_helper(vec, i, right, k);    
      
};

int nth_element(int vec[], int n, int k) {
 
     nth_element_helper(vec, 0, n - 1, k);

     return vec[ k ];
};