二分查找注意点
2013-05-28 17:02
197 查看
二分查找的前提: 已序序列
正确算法:
错误点1:
循环区间是[left, right)
但是每次调整去见识mid+1或者mid-1的值会被丢失
例如: 1,3,5,7,9 ,用下面算法查找3 会返回没有找到
错误点2:
如果查找的value不存在array中,会导致死循环,因为区间缩小到最中间2个位置,就无法继续缩小了,永远无法退出,
例如1,3,5,7,9 中查找2 导致死孙桓
错误点3:
如果2个数组位数很大,可能导致溢出
正确算法:
int binary_sort(int arr[], int length, int value) { if(arr == NULL || length == 0) return -1; int ret = -1; int left = 0; int right = length-1; while(left <= right) { int mid = left + (right-left)/2; if(value > arr[mid]) { left = mid + 1; } else if(value < arr[mid]) { right = mid -1; } else { ret = mid; break; } } return ret; }
错误点1:
循环区间是[left, right)
但是每次调整去见识mid+1或者mid-1的值会被丢失
例如: 1,3,5,7,9 ,用下面算法查找3 会返回没有找到
while(left < right) { int mid = left + (right-left)/2; if(value > arr[mid]) { left = mid + 1; } else if(value < arr[mid]) { right = mid -1; } else { ret = mid; break; } }
错误点2:
如果查找的value不存在array中,会导致死循环,因为区间缩小到最中间2个位置,就无法继续缩小了,永远无法退出,
例如1,3,5,7,9 中查找2 导致死孙桓
while(left <= right) { int mid = left + (right-left)/2; if(value > arr[mid]) { left = mid; } else if(value < arr[mid]) { right = mid; } else { ret = mid; break; } }
错误点3:
如果2个数组位数很大,可能导致溢出
while(left <= right) { int mid = (left + right)/2; if(value > arr[mid]) { left = mid; } else if(value < arr[mid]) { right = mid; } else { ret = mid; break; } }
相关文章推荐
- 常见对象_二分查找使用的注意事项
- 二分查找的注意事项
- LeetCode278——First Bad Version(二分查找+一个注意点)
- 二分查找注意两点
- 二分查找,要注意的地方
- 二分查找的各种情况实现以及一些注意点
- 二分查找注意点(转)
- 二分查找需要注意的几点及优化
- 二分查找需要注意的问题,以及在数据库内核中的实现
- [LeetCode 278] First Bad Version(二分查找的一个常见注意点)
- 写正确函数需要注意的地方:二分查找
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现
- 二分查找,要注意的地方--写一个正确的二分查找,并不简单
- 二分查找的一些注意事项
- 二分查找要注意的问题
- C++ - 二分查找完整版(包括注意细节)
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现[谁有源码麻烦贴过来个链接学习学习]
- 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现