版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014281392/article/details/80990528
二分查找:
主要基于有序序列的查找算法,时间复杂度为O(logN)
首先确定序列的下标区间[left, right],然后每次判断当前[left, right]中点 mid = (left + right) / 2 , 的元素 n[mid] 与 查询元素 x 的大小关系.
如果,n[mid] > x, right = mid - 1;
如果,n[mid] < x, left = mid + 1;
递减序列:
n[mid] > x, left = mid + 1;
n[mid] < x, right = mid - 1;
使用过程中需要注意的地方:
- 如果二分上界超过 int 数据类型范围的一半,(left + right) 可能会溢出.
- 使用 mid = left + (right - left) /2 ,替代 mid = (left + right)/2;
举个例子:
A[10] = [1, 3 , 5 , 7 , 8 , 9, 11, 14, 16, 19];
查找 x = 14,在A中的位置;
#include <iostream>
using namespace std;
int binarySearch(int a[], int left, int right, int x) {
int mid;
while(left <= right) {
mid = (left + right)/2;
if (a[mid] == x) return mid;
else if (a[mid] > x)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
int main() {
int x = 14;
int A[10] = {1, 3, 5, 7, 8, 9, 11, 14, 16, 19};
int index = binarySearch(A, 0, 9, x);
if (index > 0) cout<<index<<endl;
else cout<<"no exist"<<endl;
}