博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分查找及其变种简单易懂的模版
阅读量:7124 次
发布时间:2019-06-28

本文共 2143 字,大约阅读时间需要 7 分钟。

鉴于最近在网上看到的二分查找算法非常复杂,细节太多,不容易理解,下面给出几个实现简洁,又容易理解的代码模版。

首先,让我们记住最基本的二分查找模版:

在有序数组A中查找key,如果找到,返回位置索引,否则,返回-1;

int BinarySearch(int A[], int n, int key){    int left = 0, right = n - 1;    while (left <= right) {        int mid = left + (right - left) / 2;        if (A[mid] < key) {            left = mid + 1;        } else if (A[mid] > key) {            right = mid - 1;        } else {
// A[mid] == key return mid; } } return -1;}

变种1:如果A有多个key元素,返回最大的,否则,返回-1

int BinarySearch(int A[], int n, int key){    int left = 0, right = n - 1;    int result = -1;    while (left <= right) {        int mid = left + (right - left) / 2;        if (A[mid] < key) {            left = mid + 1;        } else if (A[mid] > key) {            right = mid - 1;        } else {
// A[mid] == key result = mid; left = mid + 1;//继续查找右半边 } } return result;}

变种2:如果A中有多个key元素,返回最小的,否则,返回-1

int BinarySearch(int A[], int n, int key){    int left = 0, right = n - 1;    int result = -1;    while (left <= right) {        int mid = left + (right - left) / 2;        if (A[mid] < key) {            left = mid + 1;        } else if (A[mid] > key) {            right = mid - 1;        } else {
// A[mid] == key result = mid; right = mid - 1;// 继续查找左半边 } } return result;}

 变种3:在有序数组A中,查找出最小的比key大的元素索引。

int BinarySearch(int A[], int n, int key){   if (A[n-1] < key)        return -1;    int left = 0, right = n - 1;    while (left != right) {        int mid = left + (right - left) / 2;        if (A[mid] <= key) {            left = mid + 1;        } else {            right = mid;        }     }    return left;}

 

变种4:在有序数组A中,查找出最大的比k小的元素索引。

int BinarySearch(int A[], int n, int key){    if (A[0] > key)        return -1;    int left = 0, right = n - 1;    while (left < right-1) {        int mid = left + (right - left) / 2;        if (A[mid] >= key) {            right = mid - 1;        } else {            left = mid;        }     }    if (A[right] < key) {        return right;    } else {        return left;    }}

 

转载于:https://www.cnblogs.com/xingzhg/p/3942221.html

你可能感兴趣的文章
《C++语言基础》实践项目——多重继承
查看>>
京颐集团上云之路:如何助力中小型医疗行业信息化与全面上云?
查看>>
Python yield与实现
查看>>
mongodb一些使用技巧或注意事项记录
查看>>
C# 浅拷贝与深拷贝区别 解惑篇
查看>>
nested loop,merge join,hash join与子查询优化
查看>>
注册过程太痛苦,昵称起了一箩筐还是没有可用的,前端校验和后台查询不一致用户体验太差...
查看>>
Munin进阶使用
查看>>
[Nhibernate]体系结构
查看>>
【转载】对 Zookeeper 的一些分析
查看>>
IPC 和 RPC (呵呵,我感觉我应该要钻研到这个深度啦)
查看>>
设计可以多选的按钮ChooseManyButton
查看>>
NSURLErrorDomain Code=-999
查看>>
SQL模板资源管理器,你用了吗?
查看>>
ORA-00600: internal error code, arguments: [17281], [1001], [0x1FF863EE8], [], [], [], [], []
查看>>
Integer取值范围和NumberFormatException的解决
查看>>
网站技术笔记-演化
查看>>
【转】IE10 CSS hack
查看>>
堆排序(1)
查看>>
Node.js之HTTP请求与响应
查看>>