查找算法(部分)

news2024/9/29 11:35:50

 

顺序查找

顺序查找是最简单的了,属于无序查找算法,它的原理就是从前往后一个一个的找,如果找到了就返回它的位置,否则就返回-1。

如果有多个相同元素的话,返回第一个该元素的位置。

代码:

#include<stdio.h>
#define N 100
int main()
{
	int a[N],n,x;//x表示要查找的元素 
	scanf("%d %d",&n,&x);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	int j;
	for(j=0;j<n;j++)
	{
		if(a[j]==x)//如果找到直接跳出循环 
		break;
	}
	if(j>=n)
	{
		printf("-1");//如果没找到就返回-1 
	}
	else
	{
		printf("%d ",j+1);//返回它的位置,即是第几个元素 
	}
	return 0;
} 

运行:

 20200302101449382.png

二分查找

二分查找(Binary Search)算法,也叫折半查找算法,针对有序查找算法(即只适用于有序序列的查找)。它的原理就是每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

代码:

#include<stdio.h>
#define N 100
int main()
{
	int a[N],n,x;//x表示要查找的元素 
	scanf("%d %d",&n,&x);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	int left=0,right=n-1,mid;
	while(left<=right)
	{
		mid=(left+right)/2;
		if(x==a[mid]) break;
	    if(x>a[mid]) 
	    {
		    left=mid+1;
	    }
	    else
	    {
		    right=mid-1;
	    }
    }
	if(left>right)
	{
		printf("-1");//如果没找到就返回-1 
	}
	else
	{
		printf("%d ",mid+1);//返回它的位置,即是第几个元素 
	}
	return 0;
} 

运行:

 20200302112325645.png

插值查找

插值查找就是二分查找的改进,其算法思路是一样的,只不过二分查找是每次是从数组的中间位置查找的,但是如果能在查找前较准确地预测关键字在数组中的位置的话,效率就会大大提高。

插值查找其核心就在于插值的计算公式key-arr[left]/arr[right]-arr[left]。细看是不是key在整序列中的占比哟。所以mid的计算公式为 left+(right-left)*(key-arr[left])/(arr[right]-arr[left])。对比二分查找的mid = (right-left)/2。

举个例子来理解一下:1 2 3 4 5 6 查找元素3

使用插值查找公式:0 +(5-0)*(3-1)/(6-1)=2,这样的话一次就找到了,效率要高于二分查找。

对表长较长,且关键字分分布比较均匀,插值查找算法的平均性能要比二分查找要好的多。但是 如果表中 关键字分布极端不均匀 那么插值查找还不如折半查找呢。

代码和折半查找一模一样,唯独mid的计算方式发生改变。

代码:

#include<stdio.h>
#define N 100
int main()
{
	int a[N],n,x;//x表示要查找的元素 
	scanf("%d %d",&n,&x);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	int left=0,right=n-1,mid;
	while(left<=right)
	{
		mid=left+(right-left)*(x-a[left])/(a[right]-a[left]);
		if(x==a[mid]) break;
	    if(x>a[mid]) 
	    {
		    left=mid+1;
	    }
	    else
	    {
		    right=mid-1;
	    }
    }
	if(left>right)
	{
		printf("-1");//如果没找到就返回-1 
	}
	else
	{
		printf("%d ",mid+1);//返回它的位置,即是第几个元素 
	}
	return 0;
} 

运行:

 20200302190652883.png

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

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

相关文章

高通开发系列 - RT补丁死机问题scheduling while atomic

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 背景概述问题现象了解RTOS如何使用高分辨率计时器?RT-mutex 实现设计线程化的中断处理程序睡眠spinlock

图解python | 字符串及操作

1.Python元组 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号&#xff0c;列表使用方括号。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 tup1 (ByteDance, ShowMeAI, 1997, 2022) tup2 (1…

通过FTP和HTTPD,搭建内网yum仓库

一、yum仓库的简介 1.yum介绍 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。解决了日常工作中的大量查找安装依赖包的时间 为什么会有依赖关系的发生 因为li…

GPT图解大模型是怎样构建的

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

网络文件共享服务

目录 一.存储类型&#xff1a; 1.存储类型分为三种&#xff1a; 2.NAS的概述&#xff1a; 3.SAN的概述&#xff1a; 4.DAS的概述&#xff1a; 二.FTP 文件传输协议&#xff1a; 1.FTP工作原理&#xff1a; 2.FTP的两种模式&#xff1a; 3.FTP的用户认证&#xff1a; 三…

Ncast盈可视高清智能录播系统busiFacade RCE漏洞(CVE-2024-0305)

产品介绍 Ncast盈可视高清智能录播系统是一套新进的音视频录制和播放系统&#xff0c;旨在提供高质量&#xff0c;高清定制的录播功能。 漏洞描述 广州盈可视电子科技有限公司的高清智能录播系统存在信息泄露漏洞(CVE-2024-0305)&#xff0c;攻击者可通过该漏洞&#xff0c;…

【HarmonyOS4.0】第十篇-ArkUI布局容器组件(二)

三、层叠布局容器&#xff08;Stack&#xff09; 堆叠容器组件 Stack的布局方式是把子组件按照设置的对齐方式顺序依次堆叠&#xff0c;后一个子组件覆盖在前一个子组件上边。 注意&#xff1a;Stack 组件层叠式布局&#xff0c;尺寸较小的布局会有被遮挡的风险&#xff0c; …

【PyQt小知识 - 7】:QLineEdit设置输入的文本以圆点或星号等方式显示

文章目录 setEchoMode setEchoMode 在PyQt中&#xff0c;QLineEdit是一种用于接收用户输入的小部件&#xff08;widget&#xff09;。setEchoMode是QLineEdit类中的一个方法&#xff0c;可以用于设置文本输入框中的文本显示模式。它接受一个参数来指定要使用的模式。 setEcho…

springIoc依赖注入循环依赖三级缓存

springIoc的理解&#xff0c;原理和实现 控制反转&#xff1a; 理论思想&#xff0c;原来的对象是由使用者来进行控制&#xff0c;有了spring之后&#xff0c;可以把整个对象交给spring来帮我们进行管理 依赖注入DI&#xff1a; 依赖注入&#xff0c;把对应的属性的值注入到…

一文读懂「生成式AI,AIGC」

一、什么是AIGC&#xff1f; 二、技术层面发展 AIGC要素&#xff1a;算力 算法 数据 AIGC发展重点 AIGC产业链路 AIGC未来方向 三、产业层面发展 AIGC产业融资 AIGC场景应用 四、AIGC应用分析 AI 游戏 eg&#xff1a;网易伏羲 AI 广告营销 eg&#xff1a; AI 影…

vue使用i18n实现国际化

安装 npm install vue-i18nnext在src下创建一个名为i18n的文件夹,并按照下图创建需要的文件 i18n/locales/en.json {"common": {"BUTTON_OK": "OK","BUTTON_CANCEL": "Cancel","BUTTON_SUBMIT": "Submit…

虾皮广告数据分析:如何在虾皮(Shopee)平台上进行广告推广

在虾皮&#xff08;Shopee&#xff09;平台上进行广告推广是提高产品曝光率和销量的有效方式。通过采取一系列步骤&#xff0c;卖家可以充分利用Shopee的广告功能来推广产品。本文将介绍如何在Shopee上进行广告推广&#xff0c;并提供一些实用的技巧和建议。了解广告类型首先&a…

数据库——DAY4(练习-在表中查找数据-多表查询)

一、实验要求&#xff08;多表查询&#xff09; 素材&#xff1a; 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); …

Tessy—嵌入式软件单元测试/集成测试工具

产品概述 Tessy源自戴姆勒—奔驰公司的软件技术实验室&#xff0c;由德国Hitex公司负责销售及技术的支持服务&#xff0c;是一款专门针对嵌入式软件进行单元/集成测试的工具。它可以对C/C代码进行单元、集成测试&#xff0c;可以自动化搭建测试环境、执行测试、评估测试结果并生…

yarn包管理器在添加、更新、删除模块时,在项目中是如何体现的

技术很久不用&#xff0c;就变得生疏起来。对npm深受其害&#xff0c;决定对yarn再整理一遍。 yarn包管理器 介绍安装yarn帮助信息最常用命令 介绍 yarn官网&#xff1a;https://yarn.bootcss.com&#xff0c;学任何技术的最新知识&#xff0c;都可以通过其对应的网站了解。无…

el-tree定义左边箭头,包括下级出现连线

效果图&#xff1a; 代码&#xff1a; <template><div class"agency-wrap"><el-treeclass"filter-tree":data"detailList":props"defaultProps"default-expand-allnode-click"onClickNode":filter-node-me…

基于springboot+vue的网上花卉商城系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

2、BERT:自然语言处理的变革者

请参考之前写的&#xff1a;2、什么是BERT&#xff1f;-CSDN博客文章浏览阅读826次&#xff0c;点赞19次&#xff0c;收藏22次。BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是Google在2018年提出的一种自然语言处理&#xff08;NLP&…

入门Docker1: 容器技术的基础

目录 服务器选型 虚拟机 基于主机(物理机或虚机)的多服务实例 基于容器的服务实例 Docker Docker三要素 Docker安装 Docker基本使用 基本操作 仓库镜像 容器 服务器选型 在选择服务器操作系统时&#xff0c; Windows 附带了许多您需要付费的功能。 Linux 是开放源代…

经营中东市场的跨境电商卖家看过来!亚马逊中东站热卖商品有哪些?

中东是跨境电商必须进入的一个大蓝海市场。目前亚马逊已经向中国卖家开放了17个站点&#xff0c;其中亚马逊中东站作为中东地区最大的电商平台&#xff0c;吸引了众多消费者的关注。作为亚马逊卖家&#xff0c;熟知跨境电商中东市场的热销选品对成功运营至关重要&#xff0c;今…