二分查找

  • 建立在数组有序的基础上
  • key 与 a[mid] 比较来限界
  • 查找过程可以细分为四种情况
    • 在范围外,查找不到
    • 特殊情况,边界值
    • 一般情况,中间值
    • 在范围内,查找不到
#include <iostream>

using namespace std;

// 二分查找
int binarySearch(const int *a, int key, int low, int high) {
    // 在范围外,查找不到
    if (key < a[low] || key > a[high]) return -1;

    // 特殊情况,边界值
    if (key == a[high]) return high;
    if (key == a[low]) return low;

    // 一般情况,中间值
    while (low <= high) { // while中这一关系可能改变,改变说明找不到
        int mid = (low + high) / 2;
        if (key > a[mid]) low = mid + 1;
        else if (key < a[mid]) high = mid - 1;
        else return mid;
    }

    return -1; // 在范围内,查找不到
}

void printArray(const int *a, int len) {
    for (int i = 0; i < len; ++i) {
        cout << a[i] << " ";
    }
    cout << endl;
}

int main() {
    int a[10] = {0, 16, 24, 35, 47, 59, 62, 73, 88, 99};
    printArray(a, 10);
    cout << "查找:";
    int key;
    cin >> key;
    cout << "位置:" << binarySearch(a, key, 0, 9);
    return 0;
}
0 16 24 35 47 59 62 73 88 99 
查找:24
位置:2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 二分查找jdk源码 时间O(logn)空间O(1) 递归式写法: 时间和空间都是O(logn) 2. 二分插入...
    少冰三hun甜阅读 2,934评论 0 1
  • 数据结构与算法--查找之顺序查找和二分查找 符号表的目的是将一个键和一个值关联起来,可以将一对键值对插入到符号表中...
    sunhaiyu阅读 5,797评论 1 2
  • 1 前言 二分查找本身是个简单的算法,但是正是因为其简单,更容易写错。甚至于在二分查找算法刚出现的时候,也是存在b...
    __七把刀__阅读 5,298评论 0 1
  • 原理并不复杂,[low,high]构成了潜在区间,如果中值不等于目标,则减半对应的区间。有一个问题:为什么循环条件...
    熊白白阅读 4,112评论 0 0
  • 二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好...
    JasonDing阅读 5,405评论 0 3