折半查找包含程序

news2025/3/3 4:57:47

折半查找又称二分查找,它仅适用于有序的顺序表

以下面的例子来讲解折半查找的过程

元素710131619293233374143
数组位置012345678910

 第一步:先确定查找元素,以14为例子;low和high分别是指向表的上界和下界;最开是low指向0,high指向10,mid = (low+high)/2 = 5规定向下取整(程序实现的时候计算机规定的是向下取整)

元素710131619293233374143
数组位置012345678910
lowmidhigh

第二步:通过mid位置元素的值,和想要查找元素进行比较;29>14,由于是顺序表,可以知道14肯定是在29左边,因为high规定是指向表的下界,因为mid之前已经比较过了,所以high肯定是指向mid前面一个元素的位置;此时high = 4;low = 0不变;  mid = (low+high)/2 = 2;

元素710131619293233374143
数组位置012345678910
lowmidhigh

第三步:重复第二部的工作,通过mid位置元素的值,和想要查找元素进行比较;13<14,由于是顺序表,所以肯定知道14在13的右边,因为low指向的是表的上界,所以此时low = mid+1 = 3;high = 4不变;mid = (low+high)/2 = 3.5向下取整为3

元素710131619293233374143
数组位置012345678910

low

mid

high

第四步:因为16>14,所以high = mid-1 = 2,此时low>high表示查找失败,没有该元素

元素710131619293233374143
数组位置012345678910
high

low

//折半查找
int Binary_Search(SSTable L, int key)
{
	int low = 0, high = L.length-1, mid;//low表示查找表第一个元素的位置,high表示查找表最后一个元素的位置,mid表示中间元素的位置
	while(low <= high)
	{
	  mid = (low+high)/2;//取中间位置,向下取整
	  if(L.elem[mid] == key)
		  return mid;//若查找成功则返回所在位置
	  else if(L.elem[mid] > key)
	  {
	    high = mid-1;//从前半部分查找
	  }
	  else
	  {
	    low = mid+1;//从后半部分继续查找
	  }

	}
	return -1;//查找失败返回-1
}

折半查找的过程可以用二叉树来描述,称为判定树

树中的叶节点都是方块的形状,它表示的是查找不成功;圆圈表示非终端结点,表示查找表中的元素;若非终端元素为n个,则方块的则有n+1个 = 成功结点的空链域数量;判定树是一棵平衡二叉树

h是树高,并且元素个数是n时树高h = \log (n+1)向上取整,所以时间复杂度为O(\log n) ,平均情况下比顺序查找的效率高,但是不是折半查找一定比顺序查找效率高

mid向下取整时

如果当前low和high之间有奇数个元素,则mid分隔后,左右两部分元素个数相等

如果当前low和high之间有偶数个元素,则mid分隔后,左半部分比右半部分少一个元素

总结:右子树结点数  -  左子树结点数 = 0或1

程序:

1.数组结构体

//定义动态数组结构体
typedef struct
{//查找表得数据结构--顺序表
  int *elem;//动态数组的基址
  int length;//表的长度
}SSTable;

 2.创造数组

void CreatSSTable(SSTable &L)
{
  int len;
  printf("请输入你想查找表的长度为:\n");
  scanf_s("%d",&len);
  L.length = len;
  L.elem = (int *)malloc(sizeof(int)*L.length);
  int val;//用于暂存查找表的元素
  for(int i = 0; i < L.length; ++i)
  {
	  printf("请输入第%d个元素:",i+1);
	  scanf_s("%d",&val);
	  L.elem[i] = val;
  }
}

3.折半查找

//折半查找
int Binary_Search(SSTable L, int key)
{
	int low = 0, high = L.length-1, mid;//low表示查找表第一个元素的位置,high表示查找表最后一个元素的位置,mid表示中间元素的位置
	while(low <= high)
	{
	  mid = (low+high)/2;//向下取整
	  if(L.elem[mid] == key)
		  return mid;
	  else if(L.elem[mid] > key)
	  {
	    high = mid-1;
	  }
	  else
	  {
	    low = mid+1;
	  }

	}
	return -1;//查找失败返回-1
}

4.运行结果

完整程序

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//定义动态数组结构体
typedef struct
{//查找表得数据结构--顺序表
  int *elem;//动态数组的基址
  int length;//表的长度
}SSTable;

//函数说明
void CreatSSTable(SSTable &L);
int Binary_Search(SSTable L, int key);

int main(void)
{
  SSTable L;
  CreatSSTable(L);
  printf("请输入你想查找元素的值:\n");
  int key;
  scanf_s("%d",&key);
  int pos = Binary_Search(L,key);
  if(pos == -1)
	  printf("查找失败,查找表中没有%d",key);
  else
	  printf("元素%d是在查找表第%d个元素",key,pos+1);
  return 0;
}

void CreatSSTable(SSTable &L)
{
  int len;
  printf("请输入你想查找表的长度为:\n");
  scanf_s("%d",&len);
  L.length = len;
  L.elem = (int *)malloc(sizeof(int)*L.length);
  int val;//用于暂存查找表的元素
  for(int i = 0; i < L.length; ++i)
  {
	  printf("请输入第%d个元素:",i+1);
	  scanf_s("%d",&val);
	  L.elem[i] = val;
  }
}

//折半查找
int Binary_Search(SSTable L, int key)
{
	int low = 0, high = L.length-1, mid;//low表示查找表第一个元素的位置,high表示查找表最后一个元素的位置,mid表示中间元素的位置
	while(low <= high)
	{
	  mid = (low+high)/2;//向下取整
	  if(L.elem[mid] == key)
		  return mid;
	  else if(L.elem[mid] > key)
	  {
	    high = mid-1;
	  }
	  else
	  {
	    low = mid+1;
	  }

	}
	return -1;//查找失败返回-1
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Cookie】Cookie简介以及跨域问题

Cookie 一、Cookie简介 1、Cookie是什么 cookie是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络浏览行为有关&#xff0c;所以存储在你电脑上的cookie就好像你的一张身份证&#xff0c;你电脑上的cookie和其他电脑上的cookie是不一样的。 …

java 堆(优先级队列)详解

JAVA堆以及优先级队列详解 一、堆的模拟实现1.1堆的概念1.2 堆的性质1.3堆的存储结构1.4堆的创建1.4.1 只有根节点不满足堆的特性1.4.2 不只有根节点不满足堆的特性1.4.2.1 建堆代码1.4.2.2 建堆过程图示 1.4.3 建堆的时间复杂度 1.5堆的插入1.5.1堆的插入的基本思想1.5.2堆的插…

非局部attention之Non-local

论文&#xff1a;Non-local Neural Networks Github&#xff1a;GitHub - AlexHex7/Non-local_pytorch: Implementation of Non-local Block. GitHub - facebookresearch/video-nonlocal-net: Non-local Neural Networks for Video Classification cvpr2018 凯明作品 论文提出…

Echarts自定义legend图例

legend: {icon: rect, // 形状itemHeight: 4, // 高度itemWidth: 18, // 宽度itemGap: 15, //设置图例的间距...... }, 效果&#xff1a;

QT进度条代理的实现

目的 进度条也是一个基本的功能&#xff0c;这里进度条想在Tableview里面实现&#xff0c;让Tableview其中一个单元格显示进度条&#xff0c;因为就用了代理。 什么是代理&#xff0c;官方说&#xff1a; 代理(Delegate)就是在视图组件上为编辑数据提供编辑器&#xff0c;如在…

Kindle刷机安装微信读书。

1、越狱 2、安装软件 3、刷机 4、安装微信读书 刷机参考链接&#xff1a; https://www.xiaohongshu.com/explore/63d3f730000000001f027d0e?sourcequestion Kindle 通用越狱教程&#xff1a;适用固件版本 5.12.2.2~5.14.2 – 书伴 正式开始了。 1、越狱&#xff0c;参考…

[Flask] Flask会话

由于HTTP的无状态性&#xff0c;为了使某个域名下的所有网页能够共享某些数据&#xff0c;Cookie和Session应运而生 1.Cookie对象 HTTP是无状态(stateless)协议&#xff0c;一次请求响应结束后&#xff0c;服务器不会留下任何关于对方状态的信息 也就是说&#xff0c;尽管在…

2023年数字人产业发展趋势报告:好看的皮囊到有趣的灵魂

报告来源&#xff1a;腾讯研究院 报告看点&#xff1a;随着交互智能技术的加速发展&#xff0c;数字人正在从技术创新走向产业应用。 在腾讯2022数字生态大会腾讯云智能专场上&#xff0c;腾讯研究院、腾讯云智能、创业黑马经过产业研究、实地调研&#xff0c;共同提炼发布《数…

【Spring】Spring Bean 容器的生命周期是什么样的?

文章目录 一、什么是 Spring Bean 的生命周期&#xff1f;二、Spring 中的 bean 的作用域有哪些?三、Spring Bean 的生命周期四、Spring Bean 的生命周期流程图 一、什么是 Spring Bean 的生命周期&#xff1f; 对于普通的 Java 对象&#xff0c;当 new 的时候创建对象&#…

智头条|2023TUYA开发者大会精彩不断,IDC预测:2026年全球AI服务支出将增至646亿美元

1、行业动态 奢侈品巨头LVMH宣布将推出元宇宙项目“The Journey” 近日&#xff0c;奢侈品巨头LVMH宣布推出元宇宙项目“The Journey”&#xff0c;允许旗下用户进入一个拥有专属产品和体验的全新虚拟世界&#xff0c;目前官网显示该元宇宙项目下包括The Showroom、The Tech …

HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器&#xff0c;每种收集器都有各自的特点&#xff0c;虽然我们要对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器&am…

Tomcat的部署及优化

目录 1.Tomcat概述 1.1 Tomcat的组件构成​编辑 1.2 Tomcat功能组件结构 1.3 Tomcat的请求过程 2. Tomcat服务的部署 2.1 搭建Tomcat运行环境 3.设置JDK环境变量​ 3.1测试java环境 4.安装启动Tomcat 1.Tomcat概述 Tomcat 是 基于Java 语言开发的Tomcat 属于轻量级应用服务…

数据结构 | 顺序线性表

一、数据结构定义 typedef int SqlTableType;typedef struct seqTable{int MAXNUM; // 最大元素个数 int curNum; // 元素的个数SqlTableType* element; // 连续空间的起始地址 }*SqlTable; 二、方法概览 SqlTable CreateSqlTable(int max); // 创建空顺序表 …

MySQL——mha高可用

MHA的概念 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过…

【Android -- 面试】程序员面试必备软技能,值得收藏!

文章目录 一、准备技术型简历1. 准备简历模板2. 准备个⼈信息3. 准备专业技能4. 准备⼯作经历5. 准备项⽬经历 二、面试前的准备1. 利用脑图来梳理知识点2. 收到面试邀请后的准备 三、面试的注意事项1. ⾃我介绍2. 技术考察3. 向⾯试官提问4. 面试礼仪 四、如何通过 HR ⾯1. HR…

数据结构 | 顺序栈

一、数据结构定义 typedef int StackType; typedef struct seqStack{int MAXNUM; // 最大元素个数 int top; // 栈顶位置&#xff0c;初始化为0或-1StackType element[100]; // 元素的连续空间的起始地址 } *SeqStack; 二、方法概览 SeqStack CreateSqlStack…

【服务器数据恢复】ZFS文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 某公司一台EMC某型号存储中有一组由12块硬盘组建的raid5磁盘阵列&#xff0c;其中有2块盘作为热备盘使用。 服务器故障&分析&#xff1a; raid5磁盘阵列中有2块磁盘离线&#xff0c;只有1块热备盘成功启用&#xff0c;另外一块热备盘未启用…

Elastic 栈中的 Kibana安装

Kibana 是一个开源分析和可视化平台&#xff0c;旨在与 Elasticsearch 协同工作。 你使用 Kibana 搜索&#xff0c;查看和与存储在 Elasticsearch 索引中的数据进行交互。 你可以轻松执行高级数据分析&#xff0c;并在各种图表&#xff0c;表格和地图中可视化你的数据。 官方链…

文件批量下载方法 文件批量下载工具

软件版本&#xff1a;Internet Download Manager 在当今数字化时代&#xff0c;我们日常使用电脑进行各种工作和娱乐活动。有时候&#xff0c;我们需要从互联网上下载大量文件&#xff0c;例如电影、音乐、文档等。在这种情况下&#xff0c;手动逐个下载文件将变得繁琐而耗时。…

梯度下降法求函数的解

题目 例如 y x^ 5 e^x3x−3&#xff0c;求解y 0的解 问题分析 首先要构造y 0的损失函数&#xff0c;让这个损失函数是凸的&#xff0c;也就是可以有最优解&#xff0c;并且是可到的&#xff0c;比较容易想到的是mse平方误差&#xff0c;我们要让y和0之间绝对误差最小。lo…