文章目录
- 思路
- 代码
- 以二分区间作为while判定条件
- 以给定值作为while判定条件
- 主函数
思路
- while判定条件的选择,注意最外层的return的内容就好。下面提供了两个代码版本。
- 计算 mid 时需要防止溢出(对应类型【如本例中的int】可能存不下),即 mid=left+(right-left)/2。
- 如何更改二分区间
重点说第三点,一开始的选择是当num在mid左边时直接将mid给right,反之num在mid右边将mid给left。但是这就出现了一个问题。例如:
数组元素为 1 3 5 的时候,如果你想要找4,那么:
- 第一次left = 0, right = 2, mid = 1;
- 第二次left = 1, right = 2, mid = left+(right-left)/2 = 1。
可以看出mid指向的下标是没有更改的,因此程序会陷入一直以下标1为left、mid,以下标2为right的尴尬情况——死循环。如果只是单纯的将mid的值粗暴的赋给left或者right,是没法解决问题的,因为会在一个重复的区间不断查找——当mid所指向的数组元素不为num时,mid位置已经可以被排除了,其不应该作为下一次二分区间内的位置。
说人话就是,当数组arr中有n个元素,应如下图:
这样的话就可以避免区间永远保持right>left的尴尬情况,此时也就可以通过将while的判定条件设置为left和right之间的关系来完成判定。
代码
以二分区间作为while判定条件
#include <iostream>
#include <vector>using namespace std;int halffind(vector<int>& vi, int num){int left = 0;int right = vi.size() - 1;while (left <= right) {int mid = left + (right - left)/2;int temp = vi[mid];if(temp == num){return mid;}if(temp < num){left = mid + 1;}if(temp > num){right = mid - 1;}}return -1;
}
以给定值作为while判定条件
int halffind(vector<int>& vi, int num){int left = 0;int right = vi.size() - 1;int mid = left + (right - left)/2;while (vi[mid] != num) {int temp = vi[mid];if(left > right){return -1;}if(temp < num){left = mid + 1;}if(temp > num){right = mid - 1;}mid = left + (right - left)/2;}return mid;
}
主函数
int main(int argc, char const *argv[]) {vector<int> ivec;int time,num;cout << "数组元素个数: " << endl;cin >> time;cout << "输入数组元素: " << endl;while (time--) {cin >> num;ivec.push_back(num);}int over;cout << "想要寻找的数字" << endl;cin >> over;if(halffind(ivec, over) != -1){cout << "下标为: " << halffind(ivec, over) << endl;}else{cout << "数字不在数组中" << endl;}return 0;
}