折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(logn)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
二分查找要求初始化的数组是有序的,这一点要注意哦。
二分查找的时间复杂度为:O(logn)
以下是二分查找的代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;
int BinarySearch(vector<int>& v, int key)
{
int left, right, mid, NotFound = -1;
// 初始化左、右下标
left = 0;
right = v.size() - 1;
while (left <= right)
{
// 计算中间位置,为了避免数据溢出,不采用直接相加的方式
int mid = left + (right - left) / 2;
if (key < v[mid])
right = mid - 1;
else if (key > v[mid])
left = mid + 1;
else
return mid;
}
return NotFound;
}
int main()
{
// 创建数组,并填充元素
vector<int> v;
for (int i = 0; i < 100; i++)
v.push_back(i+10);
// 打印数组中的所有元素
for (int i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl << endl;
// 进行二分查找并返回元素的下标位置,如果未找到,则返回-1
int loc = BinarySearch(v, 89);
cout << "loc = " << loc << endl;
system("pause");
return 0;
}
谢谢阅读