http://blog.csdn.net/luckyxiaoqiang/article/details/8937978
1,原始二分查找
题目:给定一个有序(非降序)数组A,求任意一个i使得A[i]等于target,不存在则返回-1
例如:[2,4,6,8,9]找(4) 位置1
1.1 递归版
int bSearch(int a[], int low, int high, int target){
if(low > high)
return -1;
int mid = (low + high)/2;
if(target<a[mid])
return bSearch(a,low,mid-1,target);
else if(target>a[mid])
return bSearch(a,mid+1,high,target);
//if(target == a[mid])
return mid;
}
1.2 迭代版
int search(int A[], int n, int target)
{
int low = 0, high = n-1;
while(low <= high)
{
// 注意:若使用(low+high)/2求中间位置容易溢出
int mid = low+((high-low)>>1);
if(A[mid] == target)
return mid;
else if(A[mid] < target)
low = mid+1;
else // A[mid] > target
high = mid-1;
}
return -1;
}
1.3 返回插入位置
给定一个有序(非降序)数组A,若target在数组中出现,返回位置,若不存在,返回它应该插入的位置。
int search(int A[], int n, int target)
{
int low = 0, high = n-1;
while(low <= high)
{
// 注意:若使用(low+high)/2求中间位置容易溢出
int mid = low+((high-low)>>1);
if(A[mid] == target)
return mid;
else if(A[mid] < target)
low = mid+1;
else // A[mid] > target
high = mid-1;
}
return -(low+1);
}
之所以返回-(low+1)而不是直接返回-low是因为low可能为0,如果直接返回-low就无法判断是正常返回位置0还是查找不成功返回的0。
2,含重复元素,求=target的最小一个
问题:给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1
例如:A[2,4,6,8,8,8,9]求8得最小位置3
int search(int A[], int n, int target)
{
int low = 0, high = n-1;
while(low <= high)
{
// 注意:若使用(low+high)/2求中间位置容易溢出
int mid = low+((high-low)>>1);
if(A[mid] == target)
{
if(mid > 0 && A[mid-1] == target)
high = mid-1;
else
return mid;
}
else if(A[mid] < target)
low = mid+1;
else // A[mid] > target
high = mid-1;
}
return -(low+1);
}
3,含重复元素,求=target的最大一个
问题:给定一个有序(非降