#include <stdio.h>
//求任意一个position使得datas[position]==num,找不到返回-1
int BinarySearch(int *datas, int l, int r, int num){
int mid, position = -1;
while (l <= r)
{
mid = l+(r-l)/2;
if(num > datas[mid])
l = mid + 1;
else if(num == datas[mid]){
position = mid;
break;
}
else
r = mid - 1;
}
return position;
}
//求最大的position使得datas[position]==num,找不到返回-1
int BinarySearch1(int *datas, int l, int r, int num){
int mid, position = -1;
while (l <= r)
{
mid = l+(r-l)/2;
if(num > datas[mid])
l=mid + 1;
else if(num == datas[mid]){
l = mid + 1;
position = mid;
}
else
r = mid-1;
}
return position;
}
//求最小的position使得datas[position] == num, 找不到返回-1;
int BinarySearch2(int *datas, int l, int r, int num){
int mid, position = -1;
while (l <= r)
{
mid = l+(r-l)/2;
if(num > datas[mid])
l= mid+1;
else if(num == datas[mid]){
r = mid - 1;
position = mid;
}
else
r = mid - 1;
}
return position;
}
//求最大的position使datas[position] < num,找不到返回-1
int BinarySearch3(int *datas, int l, int r, int num){
int mid, position = -1, start = l;
while (l <= r)
{
mid = l+(r-l)/2;
if(num > datas[mid]){
l= mid+1;
}
else if(num == datas[mid]){
r = mid - 1;
if(r >= start)position = mid - 1;
else position = -1;
}
else
r = mid - 1;
}
return position;
}
//求最小的position使datas[position] > num,找不到返回-1
int BinarySearch4(int *datas, int l, int r, int num){
int mid, position = -1, len = r;
while (l <= r)
{
mid = l+(r-l)/2;
if(num > datas[mid]){
l= mid+1;
}
else if(num == datas[mid]){
l = mid + 1;
if(l <= len)position = mid + 1;
else position = -1;
}
else
r = mid - 1;
}
return position;
}
int main(int argc, char* argv[])
{
int datas[] = {1,2,5,5,5,7,7};
int i;
while(scanf("%d", &i) != EOF){
printf("position = %d\n", BinarySearch(datas, 0, 6, i));
printf("position = %d\n", BinarySearch1(datas, 0, 6, i));
printf("position = %d\n", BinarySearch2(datas, 0, 6, i));
printf("position = %d\n", BinarySearch3(datas, 0, 6, i));
printf("position = %d\n", BinarySearch4(datas, 0, 6, i));
}
return 0;
}
转载于:https://my.oschina.net/ervinfly/blog/306114