查找等于某个数的位置
// 查找等于某个数的位置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;}复制代码
查找最后一个小于某个数的位置
和第一种情况一样,但要注意避免死循环问题。
// 查找最后一个小于某个数的位置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;}复制代码