Pagini recente » Cod sursa (job #1944839) | Cod sursa (job #456093) | Cod sursa (job #2148734) | Cod sursa (job #1035887) | Cod sursa (job #1283917)
/**
* 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 ];
};