算法竞赛入门经典:第八章 高效算法设计 8.5二分查找

/*
二分查找:
本质:有序表中使用二分查找,log2(1000)

深入:
如果数组中多个元素都是v,上面的函数返回的是中间的一个。能不能呢个求出值等于v的完整区间呢?
下面的程序当v存在时返回它出现的第一个位置。如果不存在,返回这样一个下标i:在此处插入v(原来的元素A[i],A[i+1],..全部往后移动一个位置)后序列仍然有序

思路

排序后:
0 1 3 4 6 7 9 9
输入:
8
1 9 6 3 4 7 9 0
3

8
1 9 6 3 4 7 9 0
5
输出:
2
-1
*/

/*
关键:
1 
*/

#include <stdio.h>
#include <algorithm>
#define MAXSIZE 1024

using namespace std;

int binarySearch(int* iArr,int low,int high,int iVal)//
{
	//while(low <= high)
	while(low < high)//=不能取,陷入死循环,low = high = mid
	{
		int mid = low + (high - low) / 2;
		if(iArr[mid] < iVal)//在右区间
		{
			low = mid + 1;
		}
		else if(iArr[mid] > iVal)//左区间
		{
			high = mid;
		}
		else
		{
			return mid;
		}
	}
	return -1;//如果改成low,就是iVal应该在的位置
}

int lowerBound(int* iArr,int low,int high,int iVal)//
{
	//while(low <= high)
	while(low < high)//=不能取,陷入死循环,low = high = mid
	{
		int mid = low + (high - low) / 2;
		if(iArr[mid] < iVal)//在右区间
		{
			low = mid + 1;
		}
		else if(iArr[mid] > iVal)//左区间
		{
			high = mid;
		}
		else
		{
			return mid;
		}
	}
	return low;//如果改成low,就是iVal应该在的位置
}

void process()
{
	int n;
	while(EOF != scanf("%d",&n))
	{
		int iArr[MAXSIZE];
		for(int i = 0; i < n ; i++)
		{
			scanf("%d",&iArr[i]);
		}
		sort(iArr,iArr+n);
		int iVal;
		scanf("%d",&iVal);
		//printf("%d\n",binarySearch(iArr,0,n,iVal));
		printf("%d\n",lowerBound(iArr,0,n,iVal));
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

你可能感兴趣的:(二分查找)