当前位置: 首页 > news >正文

小朋友学数据结构(6):折半查找法

小朋友学数据结构(6):折半查找法

折半查找法又称为二分查找法。

(一)基本思想

假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,此时查找成功;或直到子表不存在为止,此时查找不成功。

 
2.png

(二)时间复杂度

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。
时间复杂度就是求while循环的次数。
假设总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k,其中k就是循环的次数。
由于n/2^k取整后>=1,令n/2^k=1, 可得k=log2(n),(以2为底n的对数)。
所以时间复杂度可以表示为O(h)=O(log2(n))

(三)优缺点

优点是比较次数少,查找速度快,平均性能好;
缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

(四)C语言实现

#include<stdio.h>

// 递归实现 int recur_bin_search(int a[], int low, int high, int key) { if(low > high) { return -1; } int mid = (low + high) / 2; if(key == a[mid]) { return mid; } else if(key < a[mid]) { return recur_bin_search(a, low, mid - 1, key); } else { return recur_bin_search(a, mid + 1, high, key); } } // 非递归实现 int bin_search(int a[], int n, int key) { int low ,high, mid; low = 0; high = n - 1; while(low <= high) { mid = (low + high) / 2; if(key == a[mid]) { return mid; } else if(key < a[mid]) { high = mid - 1; } else { low = mid + 1; } } return -1; } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8}; int num = 7; int cnt = sizeof(a) / sizeof(int); int index = recur_bin_search(a, 0, cnt - 1, num); //int index = bin_search(a, cnt, num); if(-1 == index) { printf("Not found\n"); } else { printf("Index of %d is %d\n", num, index); } return 0; } 

运行结果:

Index of 7 is 6


 

转载于:https://www.cnblogs.com/alan-blog-TsingHua/p/9607582.html

相关文章:

  • 服务器终端给op,服务器里op的指令
  • dellt130服务器做系统,戴尔Dell R330;T130安装系统后键盘鼠标不能使用
  • 解决 ImportError: No module named _internal
  • 网络与验证服务器失联怎样修复,GCP用一键服务器失联了,如何重装系统?
  • BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
  • bookstrap能编辑css吗,bootstrap的定制和修改
  • sql server服务器 性能,初涉SQL Server性能问题(1/4):服务器概况
  • 3D图形学理论入门指南
  • 9月4日微软服务器,Windows Server 2012完成RTM版 9月4日上市
  • ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track
  • html一周小结
  • 4位先行进位电路 logisim_数字集成电路的自动化设计作业—1
  • CodeForces149D dfs实现区间dp
  • 内容可编辑_新标准化煤矿安全生产理念内容(最全)
  • python之基础知识-字符串和编码
  • ES6指北【2】—— 箭头函数
  • 【Leetcode】104. 二叉树的最大深度
  • echarts的各种常用效果展示
  • extjs4学习之配置
  • gops —— Go 程序诊断分析工具
  • JavaScript 基本功--面试宝典
  • js如何打印object对象
  • Ruby 2.x 源代码分析:扩展 概述
  • Vue官网教程学习过程中值得记录的一些事情
  • Webpack 4 学习01(基础配置)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对象引论
  • 用element的upload组件实现多图片上传和压缩
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 在Unity中实现一个简单的消息管理器
  • 栈实现走出迷宫(C++)
  • UI设计初学者应该如何入门?
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • ()、[]、{}、(())、[[]]命令替换
  • (6)STL算法之转换
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (区间dp) (经典例题) 石子合并
  • (十) 初识 Docker file
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)程序员疫苗:代码注入
  • ******之网络***——物理***
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • [C++核心编程](四):类和对象——封装
  • [CLickhouse] 学习小计
  • [Everyday Mathematics]20150130
  • [ffmpeg] aac 音频编码
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [HackMyVM]靶场 VivifyTech
  • [hihocoder1395] 最大权闭合子图
  • [JS设计模式]Prototype Pattern
  • [math]判断线段是否相交及夹角
  • [Matlab有限元分析] 2.杆单元有限元分析