二分查找
2017-08-05 19:22
239 查看
二分查找思想:二分查找可以解决预排序数组的查找问题。只要数组中包含T(即要查找的值),那么通过不断的缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组,将数组的中间项与T进行比较,可以排除一般的元素,范围缩小一半。就这样反复比较反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的表,整个查找过程大约要经过Log(2)N次比较。
注意:二分查找是针对有序的数组而言的。
注意:二分查找是针对有序的数组而言的。
#include<iostream> using namespace std; int binary_search(int arr[], int n, int key) { int left = 0; //数组的首位置,即arr[0]处 int right = n - 1;//数组的最后一个位置,即arr[n-1],数组大小为n //循环条件一定要注意 while (left <= right) { int mid =(left+right)/2; //放在while循环内部,否则mid无法正确更新;如果此处用移位代替除以2可以提高效率,而且可以防止溢出(int mid =left + ((right - left) >> 1);)。 if (arr[mid] > key)//数组中间的位置得数大于要查找的数,那么我们就在中间数的左区间找 { right = mid - 1; } else if (arr[mid] < key)//数组中间的位置得数小于要查找的数,那么我们就在中间数的右区间找 { left = mid + 1; } else { return mid;//中间数刚好是要查找的数字。 } } //执行流如果走到此处说明没有找到要查找的数字。 return -1; } int main() { int arr[5] = { 1, 3, 5, 9, 10 }; int ret1 = 0,ret2 = 0,ret3 = 0; ret1 = binary_search(arr, 5, 9); cout << ret1 << endl; ret2 = binary_search(arr, 5, 5); cout << ret2 << endl; ret3 = binary_search(arr, 5, 2); cout << ret3 << endl; }
相关文章推荐
- 没有递归的二分查找
- 二分查找原理和实现
- java泛型的二分查找
- 二分查找——C语言
- 编程珠玑第9章二分搜索(有重复数字)中查找某数出现的第一个位置
- 二分查找 找到了返回位置 没找到返回应该插入的位置
- 二分查找题
- HDU 4282 A very hard mathematic problem(二分查找)
- 二分查找的两种实现方法
- 二分查找
- 二分查找
- 算法题:二分查找的溢出考虑
- 华为中级机试题--二分查找树的应用
- 二分查找
- 折半,二分查找问题
- 无处不在的二分查找
- 二分查找
- 【二分查找】查找数组中第一个比k大的数的下标
- 二分查找
- 【二分查找】在一个长度未知的数组中查找一个数,返回其下标,时间复杂度O(logn)