您的位置:首页 > 其它

顺序统计学(算法导论第九章)

2013-05-20 21:25 323 查看
找第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 );
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: