二分法框架
- 区间
[left, size-1]
时,while (left <= right)
终止条件必为left = right + 1
- 但left和right一旦更新后,right右边必然大于或者大于等于target,left左边必然小于或小于等于target(其实就是因为经过了array[mid]与target比较的if分支)
区间[left, size-1]
| int binarySearch(int *array, int size, int target) { |
| |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (array[mid] == target) |
| return mid; |
| else if (array[mid] > target) |
| right = mid - 1; |
| else if (array[mid] < target) |
| left = mid + 1; |
| } |
| |
| return -1; |
| } |
大于等于(找应该插入的位置,左边界)
| |
| int binarySearch1(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (target > array[mid]) |
| left = mid + 1; |
| else if (target <= array[mid]) |
| right = mid - 1; |
| } |
| |
| return left; |
| } |
大于
| |
| |
| int binarySearch2(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (target >= array[mid]) |
| left = mid + 1; |
| else if (target < array[mid]) |
| right = mid - 1; |
| } |
| return left; |
| } |
小于等于(右边界)
| |
| int binarySearch3(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (target >= array[mid]) |
| left = mid + 1; |
| else if (target < array[mid]) |
| right = mid - 1; |
| } |
| return right; |
| } |
小于
| |
| int binarySearch4(int *array, int size, int target) { |
| int left = 0; |
| int right = size - 1; |
| int mid; |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (target > array[mid]) |
| left = mid + 1; |
| else if (target <= array[mid]) |
| right = mid - 1; |
| } |
| return right; |
| } |
| |
| int main() { |
| int a[] = {0, 1, 3, 3, 4, 7, 7, 7, 9, 10}; |
| printf("%d\n", binarySearch(a, 10, 3)); |
| printf("%d\n", binarySearch(a, 10, 11)); |
| printf("%d\n", binarySearch1(a, 10, 7)); |
| printf("%d\n", binarySearch2(a, 10, 7)); |
| printf("%d\n", binarySearch3(a, 10, 7)); |
| printf("%d\n", binarySearch4(a, 10, 7)); |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/16284938.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步