折半查找(二分查找)

假设为递增有序

  • 基本思路

时间复杂度:O(log2 n)

设a[low…high]是当前查找区间,首先确定该区间的中点位置mid=L(low+high)/2I,然后将待查的k值与a[mid].key比较

(1)若k==a[mid].key,则查找成功并返回该元素的物理下标

(2)若k<a[mid],则由表的有序性可知a[mid…high]均大于k,因此若表中存在关键字等于k的元素。则该元素必位于左子表a[low…mid]中,新的查找区间是左子表a[low…mid-1]

(3)若k>a[mid],则由表的有序性可知a[low…mid-1]均小于k,因此若表中存在关键字等于k的元素。则该元素必位于右子表a[mid+1…high]中,新的查找区间是右子表a[mid+1…high]

下一次的查找是针对新的查找区间进行的

因此可以从初始的查找区间a[0 … n-1]开始,每经过一次与当前查找区间的中点位置上的关键字比较就可确定查找是否成功,不成功则将当前查找区间缩小一半。重复此过程,直到找到关键字为k的元素,或直到当前查找区间为空为止。

  • 递归代码代码:
#include<stdio.h>int BinSearch(int a[],int low,int high,int k){int mid;  //当前区间存在元素if(low<=high){mid=(low+high)/2;if(a[mid]==k)return mid;if(a[mid]>k)return BinSearch(a,low,mid-1,k);elsereturn BinSearch(a,mid+1,high,k);}else return -1;
}int main(){int n=10;int i;int k=6;int a[]={3,5,6,8,10,14,16,45,67,89};i=BinSearch(a,0,n-1,k);if(i>=0)printf("a[%d]=%d\n",i,k);elseprintf("未找到%d元素\n",k);
}


  • 非递归代码
#include<stdio.h>int BinSearch(int a[],int n,int k){int low=0,high=n-1,mid;while(low<=high){mid=(low+high)/2;if(a[mid]==k)return mid;if(a[mid]>k)high=mid-1;  //左半区间 elselow=mid+1;   //右半区间 }return -1;
}int main(){int n=10;int i;int k=6;int a[]={3,5,6,8,10,14,16,45,67,89};i=BinSearch(a,n,k);if(i>=0)printf("a[%d]=%d\n",i,k);elseprintf("未找到%d元素\n",k);
}

分治法 —— 折半查找(递归与非递归)相关推荐

  1. 递归折半查找法 c语言程序,折半查找法的递归和非递归形式

    /* 1.折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止. 2.折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊l ...

  2. C语言(CED)查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。(递归实现)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 一.题目大意 查找最接近的元素(分治法/二分查找):在一 ...

  3. (C语言)BinarySearch二分搜索/折半查找 --- 递归、非递归

    1 /*2 * FILE: BinarySearch.C3 * DATE: 201803064 * ==============5 * DESCRIPTION: 折半查找_递归.非递归实现6 * 二分 ...

  4. JAVA常用算法一:二分查找【递归 or 非递归】

    文章目录 一.Java实现二分查找[递归] 二.Java实现二分查找[非递归] 三.测试 一.Java实现二分查找[递归] //递归使用二分查找public static int binarySear ...

  5. 算法006:二分查找 递归、非递归

    题目: 已知一个有序数组arr 给定需要搜索的元素,返回索引,若无则返回-1思路: 递归和非递归 1.代码如下 BinSearch .java: package com.yuhl.right;/*** ...

  6. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

  7. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  8. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  9. 二叉树的遍历-递归与非递归 - 海子

    二叉树的遍历-递归与非递归 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方 ...

最新文章

  1. 微服务架构及其最重要的 10 个设计模式!
  2. 双 11 的狂欢,干了这碗「流量防控」汤
  3. XML之父愤然离职亚马逊!看不惯公司疫情期间种种作为,百万年薪不要了
  4. char (*p3)[5] = a; 和char (*p4)[5] = a;的区别?
  5. NYOJ练习题 删除元素(二分查找)
  6. spring什么版本支持java8,与Java 11兼容的最低Spring版本
  7. 怎么把分开的pdf放在一起_糖和盐混在一起了要怎么分开?| 趣问万物
  8. 如何下载php-5.5.38.tar.gz_搭建PHP服务器php-5.3.28.tar.gz
  9. oracle 自动关闭 数据库连接
  10. A*算法收敛最优点的简单证明
  11. Android自带的抓包工具tcpdump
  12. 计算机四级网络工程师(备考过程,避开误区,高效备考!)
  13. 直播间卡人气小秘诀,快速增加直播间人气
  14. win7 注册表禁 com服务器,Win7系统注册表禁用USB和启用USB接口方法
  15. 技术总监需要做些什么?
  16. 计算机科学 贺楠,计算机学部-黑龙江东方学院.DOC
  17. 互联网观察:2021年2月信息流资讯类App月活排名分析
  18. VUE+Element-ui实战之el-calendar日历自定义显示内容
  19. SQLyog设置唯一
  20. MAGIC文件格式解析

热门文章

  1. python从入门到放弃表情图-[python从入门到放弃]基于百度OCR的文字识别
  2. python入门经典电子书-python从入门到精通pdf
  3. 车载语音最新黑科技 除了辨“音”还会识“相”
  4. 导入php项目_商业裂变,之项目技术实战(第九节:程序框架的安装)
  5. element-UI:el-table 表格排序
  6. android添加工程依赖工程,将项目依赖项添加到Android studio中的另一个项目
  7. 【王道计组笔记】主存与CPU的连接
  8. 图像检索:CEDD(Color and Edge Directivity Descriptor)算法
  9. FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
  10. java web mysql备份,Java Web 实现Mysql 数据库备份与还原