假如我们在图书馆中整理书记,书按照序号有序排序,序号不连续,当我们需要从书堆中找到特定序号的书时,如果一本一本查找的话,我们可能需要查找N次。但如果我们先找到中间的书,将书分成两堆,与待查书对比,待查书序号较大的时候从序号大的一堆中在分成两堆继续对比,书号小时从小的那堆继续对比,直到找到对应书号,这样只需查找log2(n)次。
这就是二分查找法。
例如我们有一个被排序好的数组
int a[10] = {1,3,5,7,9,11,13,15,17,19};
我们需要在其中找到13的下标
如果采用二分法:

与中间值9进行对比,比9大,取左边。

与中间值13进行对比,比9小,取右边。

与中间值13对比,相同,返回下标。
完成这个算法,我们首先需要知道左右两边的下标和中间的下标。
起始时左边下标为0,右边为数组最后一项下标,中间下标为两者的平均值。

 right = sizeof(arr)/sizeof(arr[0])-1;left =0;mid = (right + left) / 2;

因为我们需要进行多次的对比,所以需要在一个循环中进行,每次对比完后,如果比中间值大,则把左边下标改为中间值+1,如果比中间值小,则把右边下标改为中间值-1

 while(left <= right){mid = (right + left) / 2;if( n > arr[mid] ){left = mid + 1; } else if( n < arr[mid]){right = mid - 1;}else if( n == arr[mid]){return mid;}}

当左边下标小于等于右边下标时执行循环,而当跳出循环后左边下标大于右边下标时说明该数据不存在,返回一个-1,如果正确则返回下标。

 if(left > right){return -1;}

最后在主函数中用一个数对下标进行判断,如果下标为-1时,说明数据不存在,因为下标不可能<0;

 if( -1 == mid ){printf("查找失败 ");     }else{printf("下标为:%d",mid);}

运行效果:


完整代码:

#include<stdio.h>
int Binary_Search(int right,int n,int arr[])
{int left =0,mid;while(left <= right){mid = (right + left) / 2;if( n > arr[mid] ){left = mid + 1; } else if( n < arr[mid]){right = mid - 1;}else if( n == arr[mid]){return mid;}}if(left > right){return -1;}
}
int main()
{int arr[] ={1,3,5,7,9,11,13,15,17,19};int n,i,right,left,mid;right = sizeof(arr)/sizeof(arr[0])-1;left =0;printf("请输入要查找的数据:");scanf("%d",&n);mid = Binary_Search(right,n,arr);if( -1 == mid ){printf("查找失败 ");     }else{printf("下标为:%d",mid);}return 0;
}

数据结构与算法 | 二分查找相关推荐

  1. 数据结构与算法——二分查找与二叉排序树

    文章目录 1.预备知识 1.1 题目目录 1.2 二分查找 1.3 递归二分查找 1.4 循环二分查找 1.5 二叉查找(排序)树 1.6 二叉搜索树的代码实现 2.搜索插入位置 2.1 题目描述 2 ...

  2. 数据结构与算法——二分查找

    目录 前言 一.二分查找是什么? 二.代码示例 三.算法时间复杂度 总结 前言 二分查找是一种高效的查找算法,二分查找又称为折半查找,其输入是一个有序(升序或降序)的元素列表.本文通过具体的例子来说明 ...

  3. 数据结构与算法——二分查找与二叉查找树汇总整理

    目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...

  4. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  5. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  6. 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)

    查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...

  7. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  8. Java数据结构与算法 线性查找和二分查找

    查找 查找(searching)是在一组数据项中找到指定的目标元素(target element)或者判定组内不存在目标的过程.要查找的数据项组有事成为查找池(search pool). 在此讨论两种 ...

  9. 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现

    文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...

最新文章

  1. linux 下C调用Python 模块
  2. 五大常用算法之二:动态规划算法
  3. 乌班图linux分辨率不能调,ubuntu不能设置高分辨率问题的解决方法,
  4. java statement 参数_java statement详细用法
  5. intouch负值显示0_excel表格数据为负值取0-在EXCEL表格中怎么把负数显示为0?公式怎么设置?...
  6. 学计算机应用技术应具备什么素养,2018年云南经济管理学院单招计算机应用技术职业适应性测试大纲...
  7. 总结nodejs的优缺点
  8. c语言数码管按下k1显示1,单片机C语言程序的设计实训100例_基于8051+PROTEUS仿真1.docx...
  9. mac连接Linux工具推荐,mac最值得关注的终端工具,你知道几个?
  10. 强化学习从K-摇臂老虎机开始
  11. MATLAB机器人可视化运动仿真
  12. 什么是 DOM 和 BOM?
  13. (function(){})()后面的()含义
  14. 人类dna信息量_DNA 里面到底可以写入多少信息?
  15. Norton AntiVirus (诺顿杀毒)v9.0 简体中文企业版http://down.hotlife.cn/html/download/2006/5/30/1148978165.shtml
  16. 人的差异在于业余时间
  17. Halcon 算子 skeleton
  18. expr命令用法-实例讲解
  19. javafx treeview菜单千层渲染算法
  20. 运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解

热门文章

  1. spring的aop配置-配置将通知织入目标对象
  2. matlab图片拼接变成白的,利用matlab实现对图片的拼接
  3. Spring cloud集成Rabbitmq
  4. Java:ThreadPoolExecutor解析
  5. mysql的主键有什么作用_mysql设置主键有什么用
  6. 【SpringBoot零基础案例01】【IEDA 2021.1】如何创建一个SpringBoot框架web项目
  7. Push rejected: Push to origin/master was rejected
  8. HSRP双机热备工作原理与配置
  9. Swift-binary search tree
  10. Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月1日-1月6日)