找第i小的数
/**
* @brief Order Statistics
* @author An
* @data 2013.5.20
**/
#include <stdlib.h>
#include <time.h>
using namespace std;
int Partition( int *array, int low, int high )
{
int i = low - 1;
int pivot = array[ high ];
for ( int j = low; j < high; ++j )
{
if ( array[ j ] <= pivot )
{
++i;
int tmp = array[ i ];
array[ i ] = array[ j ];
array[ j ] = tmp;
}
}
++i;
array[ high ] = array[ i ];
array[ i ] = pivot;
return i;
}
int Random( int a, int b )
{
srand( (int)time(0) );
return rand() % ( b - a + 1 ) + a;
}
int RandPartition( int *array, int low, int high )
{
int index = Random( low, high );
int tmp = array[ index ];
array[ index ] = array[ high ];
array[ high ] = tmp;
return Partition( array, low, high );
}
// int RandSelect( int *array, int low, int high, int order )
// {
// if ( low == high )
// {
// return array[ low ];
// }
// int k = RandPartition( array, low, high );
// if ( order == k + 1 )
// {
// return array[ k ];
// }
// if ( order < k + 1 )
// {
// return RandSelect( array, low, k - 1, order );
// }
// else
// {
// return RandSelect( array, k + 1, high, order );
// }
// }
int RandSelect( int *array, int low, int high, int order )
{
if ( low == high )
{
return array[ low ];
}
int q = RandPartition( array, low, high );
int k = q - low + 1;
if ( order == k )
{
return array[ q ];
}
if ( order < k )
{
return RandSelect( array, low, q - 1, order );
}
else
{
return RandSelect( array, q + 1, high, order - k );
}
}