前些天我做了一道题目,题目中要求使用二分查找,我便按照我心中的二分查找,信心满满的提交上去了。结果发现无限循环,后面我便去查阅了资料
二分查找的条件
二分查找的二种方法
二种用法区别就在于
左闭右闭:每次查找的区间在[left, right],
因为定义 target 在[left, right]
区间,所以
- int search(int arr[], int size, int target) //size是数组的大小,target是需要查找的值
- {
- int left = 0;
- int right = size - 1; // 定义了target在左闭右闭的区间内,[left, right]
- while (left <= right) //当left == right时,区间[left, right]仍然有效
- {
- int mid = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
- if (arr[mid] > target)
- {
- right = mid - 1; //target在左区间,所以[left, mid - 1]
- }
- else if (arr[mid] < target)
- {
- left = mid + 1; //target在右区间,所以[mid + 1, right]
- }
- else
- { //既不在左边,也不在右边,那就是找到答案了
- return mid;
- }
- }
- //没有找到目标值
- return -1;
- }
左闭右开:每次查找的区间在 [left, right),条件控制应该如下:
- int search(int arr[], int size, int target) //size是数组的大小,target是需要查找的值
- {
- int left = 0;
- int right = size;
- while (left < right)
- {
- int mid = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
- if (arr[mid] > target)
- {
- right = mid; //target在左区间,所以[left, mid)
- }
- else if (arr[mid] < target)
- {
- left = mid + 1; //target在右区间,所以[mid + 1, right)
- }
- else
- { //既不在左边,也不在右边,那就是找到答案了
- return mid;
- }
- }
- //没有找到目标值
- return -1;
- }
这二种方法必须匹配使用循环条件和后续的区间赋值