二分查找思想:二分查找可以解决预排序数组的查找问题。只要数组中包含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;
}