// 查找等于某个数的位置
int binarySearch1(int *nums, int length, int value){
int low = 0;
int high = length - 1;
while (low < high){
int mid = (low + high) / 2;
if (nums[mid] < value)
low = mid + 1;
else if (nums[mid]>value)
high = mid - 1;
else
return mid;
}
if (nums[low] == value)
return low;
return -1;
}
复制代码
直接上代码:测试
// 查找第一个大于某个数的位置
int binarySearch2(int *nums, int length, int value){
int low = 0;
int high = length - 1;
while (low < high){
int mid = (low + high) / 2;
if (nums[mid] <= value)
low = mid + 1;
else
high = mid;
}
// 结束时low和high必定相等,而且位置合法
if (nums[low]>value)
return low;
return -1;
}
复制代码
和第一种状况同样,但要注意避免死循环问题。ui
// 查找最后一个小于某个数的位置
int binarySearch3(int *nums, int length, int value){
int low = 0;
int high = length - 1;
while (low < high){
int mid = (low + high) / 2;
if (nums[mid] >= value)
high = mid - 1;
else {
// 若是low==mid,那么将进入死循环,这是由于此时low+1==high
if (low == mid){
if (nums[high] < value)
low = high;
break;
}
low = mid;
}
}
if (nums[low] < value)
return low;
return -1;
}
复制代码
int main(){
int nums[] = { 1, 2, 3, 4, 5 };
printf("%d", binarySearch1(nums, 5, 1));
printf("%d", binarySearch1(nums, 5, 2));
printf("%d", binarySearch1(nums, 5, 3));
printf("%d", binarySearch1(nums, 5, 4));
printf("%d", binarySearch1(nums, 5, 5));
printf("\n");
printf("%d", binarySearch2(nums, 5, 1));
printf("%d", binarySearch2(nums, 5, 2));
printf("%d", binarySearch2(nums, 5, 3));
printf("%d", binarySearch2(nums, 5, 4));
printf("%d", binarySearch2(nums, 5, 5));
printf("\n");
printf("%d", binarySearch3(nums, 5, 1));
printf("%d", binarySearch3(nums, 5, 2));
printf("%d", binarySearch3(nums, 5, 3));
printf("%d", binarySearch3(nums, 5, 4));
printf("%d", binarySearch3(nums, 5, 5));
return 0;
}
复制代码