二分搜索法可以实现在一个升序的数组里快速查找一个数在这个数组里的位置,直接从代码讲解
#include<iostream>
#include<string>
using namespace std;
int search(int num[], int target,int length);//在前面声明一下这个函数
int main() {
int num[] = { -1,0,3,5,9,12 };//一个升序的数组
int target = 9;
int length = sizeof(num) / sizeof(num[0]);//得到这个数组的长度,在二分查找时会用到
//切记,使用sizeof的方法来得到数组的长度最好是在本段代码中使用,不要在用函数传递数组后,再在那个函数里用sizeof来求长度,这样得到的结果和我们预想的是不同的,因为传递过后的数组num会被当做指针来处理,64位系统中一个指针的长度就是8,所以sizeof(num)的结果是8,和我们预期的不一样。
int ret = search(num, target,length);
if (ret == -1) {
cout << "数组里不存在这个数" << endl;
}
else {
cout << num[ret] << endl;
}
system("pause");
return 0;
}
int search(int num[], int target,int length) {
int left = 0;//从数组的最左边开始
int right = length - 1; //从数组的最右边的那个数开始,所以要-1
int middle = (left + right) / 2; //取数组中间的数,这个数要用来和target对比来确定我们下一//次二分的范围
while (left <= right) {
int middle = (left + right) / 2;
if (num[middle] < target) { //如果中间的数小于target,说明target在这个数组的右边,那//么最右边的边界就可以不改变,要改变的是左边的边界,原本是0,以为middle已经小于target了,所以这//个时候我们在选择左边边界的时候就不包含middle了,所以left = middle + 1
left = middle + 1;
}
else if (num[middle] > target) {//和上面同理
right = middle - 1;
}
else {
return middle;
}
}
return -1;//找不到就返回-1
}