算法百花齐放:探索常见算法的精妙之道

news2025/2/25 6:23:29

在计算机科学的领域中,算法是一项关键而令人着迷的技术。它们是解决问题、优化效率以及创造智能系统的核心。从简单的排序和搜索任务到复杂的机器学习和深度学习应用,常见算法为我们提供了解决各种挑战的有力工具。在本篇博客中,我们将探索常见算法的精妙之道!本篇博客主要讲解冒泡排序、二分法查找(折半查找)等常见的算法。
在这里插入图片描述

大家如果想更好的理解,可以看这个网站(上面可以根据程序执行看到动画效果):https://visualgo.net/

    • ⭐ 冒泡排序算法
    • ⭐ 二分法查找(折半查找)

⭐ 冒泡排序算法

冒泡排序算法

冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。本节讲解冒泡的基础算法和优化算法,既提高大家算法的素养,也可以从容面对找工作时 JAVA 的笔试题目。

冒泡排序的基础算法

冒泡排序算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序算法的运作如下:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

在这里插入图片描述

【eg】冒泡排序的基础算法

import java.util.Arrays;
	public class TestBubbleSort {
		public static void main(String[ ] args) {
			int[ ] values = { 3, 1, 6, 8, 9, 0, 7, 4, 5, 2 };
			bubbleSort(values);
		System.out.println(Arrays.toString(values));
	}
		public static void bubbleSort(int[ ] values) {
			int temp;
			for (int i = 0; i < values.length; i++) {
			for (int j = 0; j < values.length - 1 - i; j++) {
			if (values[j] > values[j + 1]) {
			temp = values[j];
			values[j] = values[j + 1];
			values[j + 1] = temp;
				}
			}
		}
	}
}

冒泡排序的优化算法

我们可以把上面的冒泡排序的算法优化一下,基于冒泡排序的以下特点:

1.整个数列分成两部分:前面是无序数列,后面是有序数列。
2.判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了。此时可以中止比较。

在这里插入图片描述

【eg】冒泡排序的优化算法

import java.util.Arrays;
	public class TestBubbleSort2 {
		public static void main(String[ ] args) {
			int[ ] values = { 3, 1, 6, 8, 9, 0, 7, 4, 5, 2 };
			bubbleSort(values);
			System.out.println(Arrays.toString(values));
	}
		public static void bubbleSort2(int[ ] values) {
			int temp;
			for (int i = 0; i < values.length ; i++) {
// 定义一个布尔类型的变量,标记数组是否已达到有序状态
			boolean flag = true;
	/*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序数组的最后*/
			for (int j = 0; j < values.length - 1 - i; j++) {
// 如果前一个元素大于后一个元素,则交换两元素的值;
			if (values[j] > values[j + 1]) {
			temp = values[j];
			values[j] = values[j + 1];
			values[j + 1] = temp;
 //本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较;
			flag = false;
	}
}
 //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。
			if (flag) {
			break;
			}
		}
	}
}

执行结果如下所示:
在这里插入图片描述
冒泡排序的特点及性能

通过冒泡排序的算法思想,我们发现冒泡排序算法在每轮排序中会使一个元素排到一端,也就是最终需要 n-1 轮这样的排序(n 为待排序的数列的长度),而在每轮排序中都需要对相邻的两个元素进行比较,在最坏的情况下,每次比较之后都需要交换位置,所以这里的时间复杂度是 O(n²)。其实冒泡排序在最好的情况下,时间复杂度可以达到 O(n),这当然是在待排序的数列有序的情况下。在待排序的数列本身就是我们想要的排序结果时,时间复杂度的确是 O(n),因为只需要一轮排序并且不用交换。但是实际上这种情况很少,所以冒泡排序的平均时间复杂度是 O(n²)。

对于空间复杂度来说,冒泡排序用到的额外的存储空间只有一个,那就是用于交换位置的临时变量,其他所有操作都是在原有待排序列上处理的,所以空间复杂度为 O(1)。

冒泡排序是稳定的,因为在比较过程中,只有后一个元素比前面的元素大时才会对它们交换位置并向上冒出,对于同样大小的元素,是不需要交换位置的,所以对于同样大小的元素来说,相对位置是不会改变的。

冒泡排序算法的时间复杂度其实比较高。从 1956 年开始就有人研究冒泡排序算法,后续也有很多人对这个算法进行改进,但结果都很一般,正如 1974 年的图灵奖获得者所说的:“冒泡排序除了它迷人的名字和引起的某些有趣的理论问题,似乎没有什么值得推荐的。”

冒泡排序的适用场景

对于冒泡排序,我们应该对它的思想进行理解,作为排序算法学习的引导,让我们的思维更加开阔。

虽然冒泡排序在我们的实际工作中并不会用到,其他排序算法多多少少比冒泡排序算法的性能更高,但是我们还是要掌握冒泡排序的思想及实现,并且在面试时还是有可能会用到。

⭐ 二分法查找(折半查找)

二分法检索(binary search)又称折半检索(折半查找)。
在这里插入图片描述

二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值 key 与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;

否则,若 key 小,则在数组前半部分中继续进行二分法检索;

若 key 大,则在数组后半部分中继续进行二分法检索。

这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。

二分法检索是一种效率较高的检索方法。

【eg】二分法查找法的基本算法

import java.util.Arrays;
	public class TestBinarySearch {
		public static void main(String[ ] args) {
			int[ ] arr = { 30,20,50,10,80,9,7,12,100,40,8};
			int searchWord = 20; // 所要查找的数
			Arrays.sort(arr); //二分法查找之前,一定要对数组元素排序
		System.out.println(Arrays.toString(arr));
		System.out.println(searchWord+"元素的索引:"+binarySearch(arr,searchWord));
	}
		public static int binarySearch(int[ ] array, int value){
		 	int low = 0;
 			int high = array.length - 1;
 			while(low <= high){
 			int middle = (low + high) / 2;
 			if(value == array[middle]){
 			return middle; //返回查询到的索引位置
	 }
			if(value > array[middle]){
 			low = middle + 1;
 	}
 			if(value < array[middle]){
 			high = middle - 1;
 	}
 }
			return -1; //上面循环完毕,说明未找到,返回-1
 	}
}

执行结果如下所示:
在这里插入图片描述
二分查找算法的性能分析

衡量二分查找算法的性能,可以计算它的时间复杂度,也可以计算它的平均查找长度(ASL)。

二分查找算法的时间复杂度可以用O(log2n)表示(n 为查找表中的元素数量,底数 2 可以省略)。和顺序查找算法的O(n)相比,显然二分查找算法的效率更高,且查找表中的元素越多,二分查找算法效率高的优势就越明显。

计算二分查找算法的平均查找长度,可以借助下面给出的公式:
在这里插入图片描述

默认情况下,表中各个元素被查找到的概率是相同的,都是 1/n(n 为查找表中元素的数量),所以各个元素对应的 Pi 都是 1/n。

二分查找过程中,各个元素对应的查找次数 Ci 可以借助一棵二叉树直观地看出来,通常称为“判定树”。

当查找表中的元素足够多时(n足够大),二分查找算法对应的 ASL 值近似等于 log2(n+1)-1。

和顺序查找算法对应的 ASL 值 (n+1)/2 相比,二分查找算法的 ASL 值更小,可见后者的执行效率更高。

注意:

二分查找算法的时间复杂度为O(logn),平均查找长度 ASL=log2(n+1)-1。和前面章节讲解的顺序查找算法相比,二分查找算法的执行效率更高。

二分查找算法只适用于有序的静态查找表,且通常选择用顺序表表示查找表结构。

在这篇博客中,我们探索了常见算法的精妙之道,让我们的思维在数学与计算的交织中激荡出绚丽的火花。从排序算法的优雅舞蹈,到查找算法的神奇探险,我们领略了算法设计的艺术之美。

算法世界如同一片广袤的花海,每一种算法都是一朵独特的花朵,各自绽放着自己的光彩。正如百花齐放,每种算法都有其独特的应用领域和优势。在这个多元化的算法宇宙中,我们应该秉持开放的心态,不断学习和探索。

与算法相伴的还有数据结构,它们如同花瓣一样,为算法提供了坚实的基础和高效的操作方式。我们的学习之旅还远未结束,数据结构与算法的奇妙组合将继续引领我们走向新的思维境地。

在这个充满挑战和机遇的时代,掌握精妙的算法之道是非常重要的。无论是在工程开发中提升效率,还是在解决实际问题中寻找最优解,算法都是我们的得力助手。

让我们共同追求算法的卓越,探索更多未知的领域。在百花齐放的世界里,让我们的思维不断绽放,创造出更加美妙和智慧的未来!

谢谢您的阅读与关注!

愿编程之花永远绽放!

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

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

相关文章

chatgpt赋能python:Python如何过滤某个字母——关于SEO的建议

Python如何过滤某个字母——关于SEO的建议 SEO&#xff08;搜索引擎优化&#xff09;是现代网络营销中的一个重要概念。为了让自己的网站在搜索引擎排名中更加靠前&#xff0c;许多管理员和开发人员都在使用Python等编程语言来过滤特定的字母或符号&#xff0c;以优化关键词的…

linux服务器更新yum源,安装 dnf包管理器

进入yum目录 cd /etc/yum.repos.dls 查看 备份 将“CentOS-Base.repo”重命名备份为“CentOS-Base.repo.backup” mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup下载yum源并查看 下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请…

MAC 安装配置Tomcat

一、安装Tomcat 1、首先到官网下载Tomcat&#xff1a;https://tomcat.apache.org/download-80.cgi 2、解压tomcat文件,可以通过快捷键(commandshiftG)把它放入/Library(资源库中) 二、用终端打开Tomcat 1.在Bin目录下 打开终端 2.授权bin目录下的所有操作&#xff1a;终端…

Gradle Kotlin 规范插件用于模块化结构 - 共享构建逻辑

Gradle Kotlin 规范插件用于模块化结构 - 共享构建逻辑 我们中的许多人都遇到过Groovy的困难&#xff0c;并习惯于将其转换为Kotlin DSL。 然后&#xff0c;作为Android工程师&#xff0c;在完全使用Kotlin编写的项目上工作是纯粹的喜悦。 我们假设采用基于功能的模块化应用程…

PLSQL Developer 14安装

资源 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1A4DeaKPF7y-0o90nVKFbZA?pwd6udw 提取码&#xff1a;6udw阿里网盘&#xff1a; PLSQL Developer 14破解版 https://www.aliyundrive.com/s/zUdgF98VCE3安装步骤 解压安装包后&#xff0c;获得PLSQL De…

chatgpt赋能python:Python如何访问网页

Python如何访问网页 Python是一种被广泛用于web开发、数据科学和人工智能的编程语言。但是&#xff0c;你知道Python还可以用于访问网页吗&#xff1f;在本文中&#xff0c;我们将介绍Python如何访问网页&#xff0c;帮助您了解Python的这一方面&#xff0c;并掌握它的实际应用…

什么是快捷支付?

快捷支付是一种便捷的支付方式&#xff0c;它允许用户使用预先绑定的银行卡或支付账户进行快速支付&#xff0c;无需重复输入卡号、密码等详细信息。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 在快捷支付中&#xff0c;用户可以在商家网站、移动应用或支…

详解YOLOv6.2 Repvgg-style 的高效backbone:EfficientRep

论文地址: https://arxiv.org/pdf/2302.00386v1.pdf github: https://github.com/meituan/YOLOv6/releases I. 引言 自从VGG在图像分类任务中取得成功以来,卷积神经网络设计已经引起了学术界和工业界的广泛关注。目前已经提出了大量经典网络,如Inception和Resnet等。这些精心…

【论文阅读笔记】Fast Bilateral Filtering for the Display of High-Dynamic-Range Images

论文地址&#xff1a;https://people.csail.mit.edu/fredo/PUBLI/Siggraph2002/DurandBilateral.pdf 论文小结 本文提出方法的目标是压缩高动态范围图像&#xff0c;使其能够用于显示。它可以在保留细节的同时降低对比度。   基本原理是将图像分为两个尺度&#xff1a;编码大…

软考知识总结

文章目录 一、计算机系统知识2. 总线包括&#xff1a;数据总线&#xff0c;地址总线&#xff0c;控制总线3. 原码 反码 补码 移码的转换4.计算机指令-流水线和吞吐率5. 漏洞扫描系统基本概念6.CISC和RISC7.[海明码计算](https://blog.csdn.net/alzzw/article/details/123402876…

MVCC在Mysql中的运用

MVCC到底是个啥&#xff1f; 定义: 多版本并发控制&#xff0c;字面理解&#xff0c;在并发过程中利用多个版本进行合理控制&#xff08;反正我就是从字面这么理解&#xff09;&#xff0c;很明显&#xff0c;这个东西是个抽象的概念&#xff0c;事实也是如此。它主要是出现在…

OpenStack部署(二)

OpenStack部署 4. Glance4.1 创建Glance数据库并授权4.2 获得admin凭证4.3 创建glance用户并设置密码4.4 添加 admin 角色到 glance 用户和 service 项目上4.5 创建glance服务实体4.6 创建镜像服务的 API 端点4.7 yum安装Glance服务4.8 初始化镜像服务的数据库4.9 启动镜像服务…

中企出海,数智人力重构企智人效的人才供应体系

本文来自深度围观 中企出海一直是热度话题&#xff0c;综合来看&#xff0c;中企出海除了市场拓展、国际化战略、多元投资的因素之外&#xff0c;还有非常重要的一点是&#xff0c;全球供应链和资源整合。用友网络副总裁张月强总结为&#xff1a;“在产品国际化、区域经营国际…

在探索嵌入式系统世界的道路上选择51单片机

当我是一个初学者时&#xff0c;我发现选择51单片机是一个绝佳的决定。我发现51单片机基于Intel 8051架构&#xff0c;非常适合学习和教育领域的应用。刚好&#xff0c;我总结了一些嵌入式资料放在视频结尾。以下是为什么我认为51单片机是初学者的理想选择的一些原因&#xff1…

直播预告 | 在能媲美“真假美猴王”的AI面前,如何保持我们的“火眼金睛”

AI欺诈防护——业务安全大讲堂第二季第六期-CSDN直播https://live.csdn.net/room/dingxiangtech/7P3ME1HJ AI造谣层出不穷&#xff0c;险些引发社会恐慌 “2021年4月&#xff0c;上海某公司高管因对方使用AI换脸与人工生成的语音技术制作公司领导的面孔&#xff0c;并要该高管…

chatgpt赋能python:Python如何优化SEO?

Python如何优化SEO&#xff1f; Python已经成为一种非常流行的编程语言。专业人士使用Python编写众多应用程序&#xff0c;将其应用于各种行业和领域。众所周知&#xff0c;搜索引擎是市场营销的重要组成部分。SEO是在网站和搜索引擎结果页面上提高网站排名的过程。在这个过程…

ChatGPT时代:ChatGPT全能应用一本通

摘要 ChatGPT是一款开创性的人工智能语言模型&#xff0c;将人类语言理解和生成的能力推向了新的高度。作为一个全能的应用&#xff0c;ChatGPT能够在各个领域提供帮助和指导&#xff0c;从教育到医疗&#xff0c;从娱乐到商业。本文将探讨ChatGPT时代的到来&#xff0c;以及其…

三天吃透Spring面试八股文

摘自我的面试网站&#xff1a;topjavaer.cn Spring是什么&#xff1f; Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。最全面的Java面试网站&#xff1a;最全面的Java面试网站 Spring的优点 通过控制反转和依赖注入实现松耦合。支持面向切面的编程&#xff…

对话CEO:用高性价比AI视觉检测系统做客户坚盾,迎光伏行业新洗牌

“企业需要紧跟行业技术发展&#xff0c;要有前瞻性的预判和洞察&#xff0c;提前做好技术研发储备&#xff0c;下一阶段的光伏行业一定是更智能化的质效之争。我们能做的就是深入客户场景&#xff0c;将每一个细节做到极致&#xff0c;用高性价比的AI视觉产品为客户打造竞争的…

K8S之pod(十二)

一、简介 在Kubernetes集群中&#xff0c;Pod是所有业务类型的基础&#xff0c;也是K8S管理的最小单位级&#xff0c;它是一个或多个容器的组合。这些容器共享存储、网络和命名空间&#xff0c;以及如何运行的规范。在Pod中&#xff0c;所有容器都被统一安排和调度&#xff0c;…