折半查找——(递归,非递归C语言实现)

2023-11-01

折半查找

  1. 基本概念:
    1)折半查找(对半查找、二分查找):
    (a)在==有序表(假设为递增)<先排序>==中,取中间记录作为比较对象。
    (b)
    若给定值与中间记录相等,则查找成功;
    若给定值小于中间记录,则在有序表的左半区继续查找;
    若给定值大于中间记录,则在有序表的右半区继续查找。
    不断重复上述过程,直到查找成功,或查找区域无记录,查找失败
    在这里插入图片描述
  2. 例子:
    在这里插入图片描述
    PS
    mid=(low+high)/2
    若出现:low>high 则查找失败
  3. 代码:(非递归)
int BinSearch(int r[],int n,int k)
{
	int mid,low=1,high=n;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(k<r[mid])
		{
			high=mid-1;
		}
		else 
		{
			if(k>r[mid])
			{
				low=mid+1;
			}
			else
			{
				return mid;
			}
	}
	return 0;//查找失败返回0
}
  1. 代码:(递归)
int BinSearch(int r[],int low,int high,int k)
{
	int mid;
	if(low>high) return 0;
	else
	{
		mid=(low+high)/2;
		if(k<r[mid])
		{
			return BinSearch(r,low,mid-1,k);
		}
		else
		{
			if(k>r[mid])
			{
				return BinSearch(r,mid+1,high,k);
			}
			else
			{
				return mid;
			}
		}
	}
}

(只是书写格式不同)

int BinSearch(int r[],int low,int high,int k)
{
	int mid;
	if(low>high) return 0;
	else
	{
		mid=(low+high)/2;
		if(k<r[mid]) return BinSearch(r,low,mid-1,k);
		else if(k>r[mid]) return BinSearch(r,mid+1,high,k);
		else return mid;
	}
}
  1. 折半查找判定树
    1)判定树(折半查找判定树):描述折半查找判定过程的二叉树
    2)设查找区间是[low, high],判定树的构造方法:
    (1)当low>high时,判定树为空;
    (2)当low ≤ high时,
    判定树的根结点是有序表中序号为mid=(low+high)/2的记录,
    根结点的左子树是与有序表r[low]~r[mid-1]相对应的判定树,
    根结点的右子树是与有序表r[mid+1] ~ r[high]相对应的判定树。
    在这里插入图片描述
    3)结论:
    (1)折半查找任一记录的过程,即是判定树中从根结点到该记录结点的路径。
    (2)给定值的比较次数=该记录结点在树中的层数

    4)查找成功情况下,与判定树的深度有关,判定树的深度是多少呢?
    在这里插入图片描述
    5)查找不成功:
    在这里插入图片描述
    查找不成功的过程是从根结点到外部结点的路径,和给定值进行的比较次数等于该路径上内部结点的个数
    6)再上图中:
    查找成功的平均比较次数 = (1×1+2×2+3×4+4×4)/11 = 3
    <需要比较一次的一个,需要比较2次的2个,需要比较三次的4个,需要比较四次的4个>
  2. 例题:
有一个按照元素值排好序的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,比较次数分别是s和b,在查找成功的情况下,s和b的关系是();在查找不成功的情况下,s和b的关系是()。

1.不一定
2.s>b

  1. 实验:
【问题描述】
从键盘读入一串整数和一个待查关键字,查找在该整数串中是否有这个待查关键字。如果有,输出它在整数串中的位置;如果没有,输出-1。
实验要求:用递归或非递归方式实现折半查找算法
【输入形式】
首先输入一个n表示一串整数的长度,再输入一个m表示待查关键字,接下来输入n个具体元素。
【输出形式】
输出对应位置的编号或-1
【样例输入】
5 6
1 2 3 5 6
【样例输出】
5
#include<stdio.h>

//1)非递归查找
void BinSearch1(int arr[],int high,int m)
{
	int low,mid;
	low=1;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(m==arr[mid]) {printf("%d\n",mid); return ;}
		else if(m<arr[mid]){ high=mid-1; }
		else { low=mid+1; }	
	}
	if(low>high)
	{
		printf("-1\n");
	}
}

//2)递归查找 
void BinSearch2(int arr[],int low,int high,int m)
{
	int mid;
	if(low>high) printf("-1\n");
	else 
	{
		mid=(low+high)/2;
		if(m>arr[mid]) return BinSearch2(arr,mid+1,high,m);
		else if(m<arr[mid]) return BinSearch2(arr,low,mid-1,m);
		else printf("%d\n",mid);
	}

}

int main()
{
	int n,m,i,j,temp;
	scanf("%d %d",&n,&m);
	int arr[n];
	for(i=1;i<=n;i++)
	{
		scanf("%d",&arr[i]);
	}
	//排序 
	for(i=1;i<=n-1;i++)
	{
		for(j=1;j<=n-1-i;j++)
		{
			if(arr[j+1]<arr[j])
			{
				temp=arr[j+1];
				arr[j+1]=arr[j];
				arr[j]=temp;
			}
		}
	}
	BinSearch1(arr,n,m);
	BinSearch2(arr,1,n,m);
	return 0;
} 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

折半查找——(递归,非递归C语言实现) 的相关文章

  • java知识点——case

    A continue statement can be used only in a loop continue语句只能在循环中使用 A break statement can t be used only in a loop break语

随机推荐

  • 【计算机视觉

    文章目录 一 检测相关 9篇 1 1 Federated Ensemble YOLOv5 A Better Generalized Object Detection Algorithm 1 2 Zero shot Nuclei Detect
  • 使用WinDbg Preview 查看Windows 10蓝屏Dump文件

    从应用商店安装WinDbg Preview 1 登陆应用商店 搜索WinDbg Preview 2 选择获取 我的Windows 10 系统已经安装过了 3 在启动菜单可以找到WinDbg Preview 4 找到蓝屏文件 并选择使用Win
  • 【Github】错误解决:OpenSSL SSL_read: Connection was reset, errno 10054

    git 报错信息 OpenSSL SSL read Connection was reset errno 10054 Git 中 push 或者 pull 报错 OpenSSL SSL read Connection was reset e
  • arthas的trace、watch、tt、profiler命令的使用

    arthas的trace watch tt profiler命令的使用
  • 通过C语言实现小数整数求原码,反码,补码

    通过C语言实现小数 整数求原码 反码 补码 判断输入的值是整数还是小数 是正是负 求纯整数不含符号的原码 求纯小数不含符号的原码 完善整个原码 符号 小数 整数合在一起 将求原码的函数封装在一个函数里 求反码的函数 求补码的函数 main函
  • Linux-线程学习(上)

    本文导航 内容 所占百分比 线程概念 40 线程与进程区别与联系 20 线程优缺点 10 线程控制 创建 终止 等待 30 线程的概念 谈到线程 我们先从进程说起 我们写的程序从硬盘加载到内存开始运行时 进程就产生了 也就是操作系统开始为这
  • 水仙花数(Java实现)

    春天是鲜花的季节 水仙花就是其中最迷人的代表 数学上有个水仙花数 他是这样定义的 水仙花数 是指一个三位数 它的各位数字的立方和等于其本身 比如 153 1 3 5 3 3 3 现在要求输出所有在m和n范围内的水仙花数 import jav
  • 栈溢出原理

    栈溢出原理 文章目录 栈溢出原理 前言 栈 一 栈溢出原理 二 栈保护技术 三 常发生栈溢出的危险函数 四 可利用的栈溢出覆盖位置 总结 前言 栈 栈是一种LIFO的数据结构 应用程序有一到多个用户态栈 栈自底向上增长 由指令PUSH和PO
  • tcpdump抓包注意事项

    使用tcpdump进行抓包 然后用wireshark进行分析的时候 出现了 Packet size limited during capture 也不算是错误 只是数据包里的内容无法完全查看清楚 经过查询 原因是因为我在Linux下进行抓包
  • es6合并对象

    es5 let name name sea age age 15 person Object assign person name age console log person name sea age 15 es6 let name na
  • golang 读取项目配置文件

    golang读取文件配置 介绍golang项目中配置文件的读取相关内容 包括项目结构 具体实现代码等内容 ref 煎鱼 实际上这只是煎鱼博客项目中的一小部分 项目结构 配置读取相关文件结构如下 config文件夹下存放config yaml
  • 大数据从入门到精通(超详细版)之 Hive的配置与基本语法

    前言 嗨 各位小伙伴 恭喜大家学习到这里 不知道关于大数据前面的知识遗忘程度怎么样了 又或者是对大数据后面的知识是否感兴趣 本文是 大数据从入门到精通 超详细版 的一部分 小伙伴们如果对此感谢兴趣的话 推荐大家按照大数据学习路径开始学习哦
  • xman的思维导图快捷键_思维导图软件——MindMaster常用快捷键汇总

    原标题 思维导图软件 MindMaster常用快捷键汇总 思维导图 英文是The Mind Map 又叫心智导图 是表达发散性思维的有效图形思维工具 MindMaster Mac版是最新推出的一款免费跨平台 多功能的思维导图软件 可以帮助您
  • 发明计算机的人的名人名言,60句关于发明的名言

    1 没有艰苦的学习 就没有最简单的科学发明 南斯拉夫谚语 2 需要是发明之母 拉丁谚语 3 天才是不足恃的 聪明是不可靠的 要想顺手拣来的伟大科学发明是不可想象的 华罗庚 4 一项发明创造会带来更多的发明创造 爱默生 5 科学的真正的与合理
  • Selenium下Chrome配置 (含启动无痕界面--无界面浏览器)

    转载 https www cnblogs com kaibindirver p 11432850 html Selenium下Chrome配置 含启动无痕界面 无界面浏览器 例子 设置无界面模式浏览器启动 chrome options we
  • MapReduce shuffle过程详解

    一 MapReduce计算模型 我们知道MapReduce计算模型主要由三个阶段构成 Map shuffle Reduce Map是映射 负责数据的过滤分法 将原始数据转化为键值对 Reduce是合并 将具有相同key值的value进行处理
  • OpenMV4开发笔记4-舵机控制

    OpenMV4的舵机控制脚有3个 P7 P8 P9 即可以控制3个舵机 Servo 1 gt P7 PD12 Servo 2 gt P8 PD13 OpenMV3 M7 OpenMV4 H7上增加 Servo 3 gt P9 PD14 注意
  • 论EI、SCI和ISTP检索论文的收录号和期刊号查询方法

    http www scitsg com Article 134240802101541 aspx 需要申请博士后进站和国家自然科学基金的朋友都知道申请博士后进站和国家自然科学基金需要填写很多申请表格 其中就需要填写所发表的EI SCI和IS
  • Activiti 流程引擎之流程任务创建、部署流程、流程任务启动、查看当前任务、完成当前任务

    1 流程任务创建 1 在项目中创建diagram文件夹 并创建Activiti Diagram文件MyProcess bpmn 2 创建MyProcess bpmn 流程 详情如下 整体结构示意图 右击diagram文件夹 新建一个Acti
  • 折半查找——(递归,非递归C语言实现)

    折半查找 基本概念 1 折半查找 对半查找 二分查找 a 在 有序表 假设为递增 lt 先排序 gt 中 取中间记录作为比较对象 b 若给定值与中间记录相等 则查找成功 若给定值小于中间记录 则在有序表的左半区继续查找 若给定值大于中间记录