在一个有序数组中查找这样一个数:小于输入参数x的最大值
判断依据:
if( x > r[middle] )
left = middle + 1;
else
right = middle - 1;
最终的边界条件是 left = right = middle
if( x > r[middle] )
left = middle + 1;
此时left-1是数组中小于x的最大值
else( x <= r[middle] )
right = middle - 1
此时left-1仍是数组中小于x的最大值
所以折半查找程序如下
int BinerySearch(int r[], int n, const int& x)
{
int left = 0;
int right = n-1;
while( left <= right )
{
int middle = ( left + right ) / 2;
if( x > r[middle] )
left = middle + 1;
else
right = middle - 1;
}
return r[left-1];
}
折半查找可以应用到折半插入排序中
void BineryInsSort2(int r[], int n)
{
for( int i = 1; i < n; i++ )
{
int left = 0;
int right = i-1;
int temp = r[i];
while( left <= right )
{
int middle = ( left + right ) / 2;
if( temp > r[middle] )
left = middle + 1;
else
right = middle - 1;
}
for( int j = i-1; j >= left; j-- )
r[j+1] = r[j];
r[left] = temp;
}
}
参考:http://blog.minidx.com/2008/02/03/468.html