折半查找(二分查找)

1、折半查找法,也称为二分查找法, 二分搜索, 是一种在有序数组中查找某一特定元素的搜索算法.搜索过程中从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束;如果某一特定元素大于或者小于中间元素, 则在数组大于或小雨元素的那一半中查找, 而且跟开始一样从中间元素开始比较. 若某1个步骤中数组为空, 则代表找不到. 这种搜索算法每一次比骄傲都使搜索范围缩小一半.这种方法对待查找的列表有两个要求

  • 必须采用顺序存储结构
  • 必须按关键字大小有序排列

2、折半查找法分析
从定义中可以看出折半查找法有几个特性.
(1) 先决条件: 要搜索的数据已经排好序
当然, 怎样将数据排序也是1个算法, 这里先不考究了, 但是要使用折半查找法, 这个条件是必需满足的
(2) 折半查找法适合海量数据查找
折半查找法每执行1次.就会抛弃一半的无用数据, 如果数据很少的话,其实比线性查找快不了多少, 但是数据量很大的话, 抛弃的一半无用数据就很客观了! 相对于线性查找中节省了这一半数据的遍历时间啊.
(3) 折半查找法算法复杂度
假如要查找数据的数量是n, 查找的次数为x,那么查找1次(x=1), 剩下的数据量就是 (n-1)/2 = n/2 -1/2了
当x=2 时 剩下的数据量就是 n/4 - 3/4
当x=3 时 剩下的数据量就是 n/8 - 7/8
所以剩下的数据量R = n/2^x - 1 + 1/2^x
当x很大时, R就~= n/2^x -1 了
那么什么时候才会肯定会找出要找的数据呢, 或者缺认该数据不存在呢.
就是当剩余的数据量R=0 时啊.
这时 n/2^x -1 =0 => 2^x = n => x= log2^n (底为2,幂为n的对数)
所以算法复杂度就是 O(log2^n)
比起线性查找的算法复杂度O(n) , 优胜很多了.(如果n很大的话)
3、具体代码实现:


#include<stdio.h>
int main()
{int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };int left = 0,right = 9;int mid = 0;int x = 0;printf("%d\n", x);while (left <= right){mid = (left + right) / 2;if (x < mid){right = mid;//还会有在此处为right=mid-1;这样的输入,两种输入相同}else if (x > mid){left = mid+1;}else {printf("找到%d了\n", x);break;}}
}

折半查找(二分查找)相关推荐

  1. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  2. C语言之折半查找(二分查找)

    一.什么是折半查找? 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中 ...

  3. Java实现折半查找(二分查找)的递归和非递归算法

    Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其 ...

  4. Python查找-二分查找

    Python查找-二分查找 二分查找 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务. 它的基本思想是,将n个元素分成个数大致相 ...

  5. 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例

    介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...

  6. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  7. 数据结构 | 折半查找 /二分查找 算法细节、二分查找判定树

    一.基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步 ...

  8. 理论基础 —— 查找 —— 二分查找

    [概述] 二分查找又称折半查找,其要求线性表中的记录必须按关键码有序,且必须采用顺序存储. 其基本思想是:用给定值 k 先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功:若不相 ...

  9. 冒泡排序 | 快速排序 | 线性查找 | 二分查找等

    目录 排序算法:冒泡排序 排序算法:快速排序 数组的复制.反转.查询(线性查找.二分查找) 排序算法:冒泡排序 public static void main(String[] args){int[] ...

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

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

最新文章

  1. 玩转Android- 收藏集 - 掘金
  2. 实现vue2.0响应式的基本思路
  3. SAP UI5关于navigation API的boolean参数
  4. 实现贝叶斯分类器_机器学习实战项目-朴素贝叶斯
  5. 在计算机中 用户程序,在用户计算机上的万维网客户程序是()
  6. 外部中断---STM32F1
  7. LeetCode MySQL 1321. 餐馆营业额变化增长(over窗口函数)
  8. 面试题简答题——数据库相关汇总
  9. 用C#实现DES加密解密解决URL参数明文的问题
  10. 【智能制造】服装企业数字化转型之路
  11. java将Word转换成PDF
  12. 华为路由器接口IP地址如何配置与查看
  13. 刘雨昕成为Swisse斯维诗胶原蛋白系列代言人
  14. 第二人生的源码分析(二十六)底层网络协议
  15. iOS开发storyboard拖拽tableView: Static cells的使用
  16. 微生物组-宏基因组分析(线上/线下同时开课,2021.11)
  17. 固态硬盘,机械硬盘,交换内存,虚拟内存,物理内存,这些你要知道!!
  18. 熔断器hystrix的使用
  19. js中的console.log()用法
  20. dft对称性 matlab实验,数字信号处理实验 matlab版 离散傅里叶变换的性质

热门文章

  1. endsWith() 方法
  2. 史上最全vscode配置使用教程
  3. linux下解压tar zip tgz
  4. 真香!推荐一个超级简单 Java 图形验证码模块
  5. mysql学习笔记。着重号、IFNULL、常量查询、 DESCRIBE
  6. STM32CubeMX+LAN8720+LWIP+FreeRTOS实现网络通讯
  7. Django的用户登录和注册
  8. dropbear编译安装
  9. 微信小程序学习——view的显示与隐藏
  10. 16.策略模式能解决什么问题?