Pagini recente » Cod sursa (job #2656102) | Cod sursa (job #2536093) | Borderou de evaluare (job #1888082) | Cod sursa (job #2341406) | Cod sursa (job #824726)
Cod sursa(job #824726)
#include <cstdio>
#include <ctime>
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream in("sdo.in");
ofstream out("sdo.out");
void swap( int&a, int&b ){
int c = a;
a = b;
b = c;
}
int partition( int* A, int left, int right ){
int r = left + rand()%( right - left );
swap( A[r], A[right] );
int x = A[right];
int i = left - 1;
for( int j = left; j <= right - 1; j++ ){
if( A[j] < x ){
i++;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[right]);
return i+1;
}
/*
* recursive mode
int GetKth( int* A, int left, int right, int k ){
if( left == right ) return A[left];
int q = partition( A, left, right );
int i = q - left + 1;
if( i == k )
return A[q];
else if ( k < i ) return GetKth( A, left, q-1, k );
else return GetKth( A, q+1, right, k - i );
}
*/
int main( int argc, char* argv[] ){
srand( (unsigned)time(NULL));
int N = 0, k = 0;
in >> N >> k;
int* v = new int[N+1];
for( int i = 1; i <= N; i++ )
in >> v[i];
in.close();
int left = 1, right = N, q = 0;
// iterative mode
do{
q = partition( v, left, right );
if( k < q )
right = q - 1;
else if ( k > q )
left = q + 1;
}while( q != k );
out << v[k]<<endl;
out.close();
delete []v;
return 0;
}