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

/*
写一个upperBound程序,当v存在时返回它出现的最后一个位置的后面的一个位置。如果不存在,返回这样一个下标i:在此处插入v(原来的元素A[i],A[i+1],..全部
往后移动一个位置)后序列仍然有序。

分析:
iArr[mid] < iVal,只可能在右区间,且mid不可能,low = mid + 1,[mid+1,y]
iArr[mid] = iVal,可能后面还有相同值元素,但mid是不可能的,low = mid+1,[mid+1,y]
iArr[mid] > iVal,左半区间,mid是可能的,作为最后一个位置后面的位置,[x,mid]
总结:
iArr[mid] <= iVal,low = mid+1
iArr[mid] > iVal,high = mid

注意这里的high是取不到的

输入:
8
0 1 3 4 6 7 9 9
5

8
0 1 3 4 4 4 9 9
4

8
0 3 3 4 4 4 9 9
3
输出:
4
6
3
*/

#include <stdio.h>
#define MAXSIZE 1024

int upperBound(int* iArr,int low,int high,int iVal)
{
	while(low < high)
	{
		int mid = low + (high - low)/2;
		if(iArr[mid] <= iVal)
		{
			low = mid + 1;
		}
		else
		{
			high = mid;
		}
	}
	return high;
}

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


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

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