二分查找(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/u014281392/article/details/80990528
今日推荐