在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法。这种搜索算法每一次比较都使搜索范围减半。第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年才出现,中间用了16年时间。

本文首先二分查找算法给出了官方标准写法,然后给出另两种改进。主要原因是,当low和high对应的数组元素比较大时,求平均值可能会造成溢出,所以针对此做了一些改进。下面是相关代码实现。

//description: 给出二分查找法的几种C语言实现方法,其中第一种是官方写法,其它两种是改进
//compile:gcc -g binary_search.c -o  binary_search
//date: 2019-04-30#include <stdio.h>int binary_search_v1(int a[], int n, int k){int low, high, mid;low = 0;high = n-1;while(low <= high){mid = (low+high)/2;if(k<a[mid])high = mid-1;else if(k>a[mid])low = mid+1;elsereturn mid;}return -1;
}int binary_search_v2(int a[], int n, int k){int low, high, mid;low = 0;high = n-1;while(low <= high){//这里当low和heigh很大时,避免溢出mid = low+(high-low)/2;if(k<a[mid])high = mid-1;else if(k>a[mid])low = mid+1;elsereturn mid;}return -1;
}int binary_search_v3(int a[], int n, int k){int low, high, mid;low = 0;high = n-1;while(low <= high){//这里使用位运算效率更高mid = low+((high-low)>>1);if(k<a[mid])high = mid-1;else if(k>a[mid])low = mid+1;elsereturn mid;}return -1;
}int main() {int arr[] = {1,3,45,78,200,213,455};int size = sizeof(arr)/sizeof(int);int key = 213;int result1 = binary_search_v1(arr, size, key);int result2 = binary_search_v2(arr, size, key);int result3 = binary_search_v3(arr, size, key);printf("binary search result: %d, %d, %d\n", result1, result2, result3);return 0;
}

运行截图如下:

参考文献

[1].https://www.toutiao.com/a6685490937977635341/

二分查找算法的一点改进相关推荐

  1. 二分查找算法的两种实现方式:非递归实现和递归实现

    二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...

  2. 二分查找算法及其变种

    前言 二分查找算法也称为折半查找算法,是一种在查找算法中普遍使用的算法.其算法的基本思想是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功:若给定的值小于中间记录的 ...

  3. list 查找_五千字长文带你学习 二分查找算法

    点击上方"与你一起学算法",选择"星标"公众号 重磅干货,第一时间送达 二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使 ...

  4. 二分查找算法介绍及实现

    一.基本概念 二分查找法(Binary Search)算法,也叫折半查找算法.二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想.每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的 ...

  5. (旋转数组的)二分查找算法

    二分查找算法(Binary Search)是一种高效的.应用广泛的查找算法.它是一种采用分治策略的算法. 基本二分查找算法 二分查找是针对顺序存储的有序序列的:二分查找的基本思想是:将目标元素与序列中 ...

  6. 二分查找算法为什么要先排序

    其实二分查找算法就和我们在一个英文字典中找一个单词一样,比如要找middle这个单词,先把字典翻到大概中间的位置,那么现在字典就被分成两个部分了,middle这个单词要么在第一个部分,要么在第二个部分 ...

  7. LeetCode面试刷题技巧-二分查找算法代码思路解析

    二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使用过二分查找的思想,不信的话,且听我慢慢为你道来. 不知道你有没有玩过这样一个游戏,猜数字.就是说一个人心里想了 ...

  8. Python 二分查找算法

    如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76 ...

  9. 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...

最新文章

  1. mysql5.5.28安装详最后一个步骤时为啥一直转_mysql5.7.28下载、安装、登陆步骤详解...
  2. linux sa 命令,Linux 常用命令全拼
  3. java中有没有栈_Java中堆和栈有什么区别
  4. [C++ Mind Map] class and memory
  5. 基于matlab的人脸五官边缘检测方法,人脸边缘检测方法研究与仿真
  6. 前端学习(1757):前端调试值之网络条件与user-Agent的设置
  7. Ionic混合移动app框架学习
  8. 类选择器遍历赋值_利用反射实现配置表数据到类对象数据的转换
  9. 从0到1入门:7天玩转IoT物联网实战营丨IoT喊你加入学习之旅!
  10. ASP.NET页面生命周期概述(转载)
  11. 如何编写测试用例(入职测开感想)
  12. pagehelper版本升级导致pageSize为0时无法查询全部数据
  13. 毕业5年决定人的一生(必看,大家有空一定要看看)
  14. Airpods Pro连接Macbook Pro偶尔会没有声音
  15. python查找第k大的数_寻找数组中第K大的数
  16. 什么是HTTPS协议?HTTPS协议优势有哪些?
  17. sp_WhoIsActive
  18. 你不是一个人在战斗——写给正在失业的80后
  19. 《WEB安全渗透测试》(21)kali安装w3af指南
  20. 谷歌seo独立站搜索引擎优化指南【2023新版】

热门文章

  1. vue 给组件绑定原生事件
  2. Codeforces 903E Swapping Characters
  3. 2022-2028年中国润滑油基础油行业市场研究及前瞻分析报告
  4. Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)
  5. “睡眠猴子”团队项目及成员介绍
  6. ios 图片自动轮播
  7. [Quick-x]制作新手引导高亮区域方法之二:裁剪模式
  8. 关于HtmlAgilityPack解析页面中数据乱码问题
  9. SVO中 Inverse Compositional Image Alignment方法的学习笔记
  10. VScode配置CMAKE文件