直接上代码了
有注释
//Author: laserss
//Time : 2012/11/14
//email : dellaser@163.com
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
int bsearch(int A[],int size,int x) //二分查找
{
int mid,low=0,high=size-1;
while(low<=high)
{
mid=low+(high-low)/2;
if(A[mid]==x) return mid;
if(A[mid]<x) low=mid+1;
else high=mid-1;
}
return -1;
}
int bsearch_firstx(int A[],int size,int x) //二分查找-x第一次出现
{
int mid,low=0,high=size-1;
while(low<high) //别写成low<=high
{
mid=low+(high-low)/2;
if(x<=A[mid]) high=mid;
else low=mid+1;
}
if(A[low]==x) return low;
return -1;
}
int bsearch_lastx(int A[],int size,int x) //二分查找-x最后一次出现
{
int mid,low=0,high=size-1;
while(low<high) //别写成low<=high
{
mid=low+(high-low+1)/2; //由后向前 +1
if(A[mid]<=x) low=mid;
else high=mid-1;
}
if(A[high]==x) return low;
return -1;
}
int bsearch_preTOx(int A[],int size,int x) //上界
{
int mid,low=0,high=size-1;
while(low<high)
{
mid=low+(high-low)/2;
if(x<=A[mid]) high=mid;
else low=mid+1;
}
if(low-1>=0) return low-1; //x!∈A[]
// if(A[low]==x&&low-1>=0) return low-1; //x∈A[]
return -1;
}
//也就是x第一次出现的位置的左边那个元素......
int bsearch_nextTOx(int A[],int size,int x) //下界
{
int mid,low=0,high=size-1;
while(low<high)
{
mid=low+(high-low+1)/2;
if(A[mid]<=x) low=mid;
else high=mid-1;
}
if(high+1<size) return high+1; //x!∈A[]
// if(A[mid]==x&&high+1<size) return high+1; //x∈A[]
return -1;
}
int main()
{
int i,j,k,n,x;
int N[]={1,2,3,3,5,6,6,7,8,9};//size=10
printf("下标:\t");
for(i=0;i<10;i++) printf("%d ",i);printf("\n元素:\t");
for(i=0;i<10;i++) printf("%d ",N[i]); printf("\n");
while(scanf("%d",&x)!=EOF)
{
printf("\t%d\n",bsearch_nextTOx(N,10,x));
}
return 0;
}