一、算法思想
升序排列的n个元素集合A分成个数大致相同的两部分,取A[n/2]与想要查找的find值作比较,如果相等则表示找到find值,算法终止。如果find<A[n/2]则表示find值在数组A的前半部分,将设置的upper值设为mid-1之后继续查找。如果find>A[n/2]则表示find值在数组A的后半部分,将设置的low值设为mid+1之后继续查找。最终函数返回find值或者-1。
二、算法步骤
在实现二分查找的BinarySearch函数中,其实现原理为:
- 首先设置low、upper、mid等值,low表示左半边的部分,upper表示右半边的部分,mid表示中间值。
- 其次使用一个while循环来进行查找find值,条件为low要小于upper。
- 循环函数里面首先将mid值求出来,最好别用两数相加除以2,那样可能会造成溢出,我所用的是low+(upper-low)/2。其次写两个判断函数来判断find值是在左半边还是右半边,之后写个else语句,如果前面两个判断函数都没有调用,则有可能mid值就是find值。
- 在循环函数外面直接返回-1,因为当循环函数循环完都没有返回则说明在数组中根本没有find值。
三、实现代码
#include<iostream>
#include<ctime>
#define N 10
using namespace std;
int BinarySearch(int A[], int n, int find) {
int low, upper, mid;
low = 0;
upper = n - 1;
while (low < upper) {
//求中间位置,最好不直接两数相加除以2,那样可能会造成溢出
mid = low + (upper - low) / 2;
if (A[mid] < find) { //想要查找的数比中间值大,说明在右半部分
low = mid + 1;
}
else if (A[mid] > find) { //想要查找的数比中间值小,说明在左半部分
upper = mid - 1;
}
//前面条件都不满足,则中间值就是我们找的值,直接返回值就行
else
return mid;
}
//循环条件没有返回,则说明在数组中没有find这个值
return -1;
}
int main() {
int A[N];
//设置随机数种子
srand((unsigned int)time(0));
for (int i = 0; i < N; ++i) {
A[i] = rand() % 50;
cout << A[i] << " ";
}
cout << endl;
int B[N]{ 12,4234,23,24,124,124,123,42143,124,214 };
cout << BinarySearch(A, N, 9) << endl;
cout << BinarySearch(B, N, 124) << endl;
for (int i = 0; i < N; ++i) {
cout << A[i] << " ";
}
return 0;
}