/*
写一个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;
}
算法竞赛入门经典:第八章 高效算法设计 8.7二分查找之upperBound
原文作者:查找算法
原文地址: https://blog.csdn.net/qingyuanluofeng/article/details/47747257
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qingyuanluofeng/article/details/47747257
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。