二分查找
#include <iostream>
using namespace std;
int binaryFind(int* arr, int len, int target)
{
int left = 0;
int right = len; # 不要用sizeof(arr)/sizeof(arr[0])求数组长度,这样相当于求一个指针所占字节数8/4=2,引入参数len
while (left <= right)
{
int mid = (right-left)/2 + left; # 为什么不用(left+right)/2,两个是数学上的恒等式,在计算机里可能两个int相加会溢出,先减除后加可以用于更大的数组if (target > arr[mid])
{
left = mid + 1; # 为什么要+1,而不left = mid? 因为 mid 已经搜索过,应该从搜索区间中去除。不+有时会出错,比如(1,2) mid==(1+2)/2==1
}
else if (target < arr[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
}
int main()
{
int n;
cin >> n;
int* arr = new int[10];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
int num;
cin >> num;
cout << "num的下标为" << binaryFind(arr, n, num) << endl;
return 0;
}
关于二分查找算法更多细节: 二分查找算法细节详解_二分查找为什么要加一减一_marytime的博客-CSDN博客

浙公网安备 33010602011771号