交换排序——选择排序和冒泡排序的区别是什么?
今天重温一下算法,其实刚开始我觉得冒泡排序和选择排序是一样的,因为他们排序过程中都是通过相邻的数据比较找到最小/最大的数据,通过不断思考和学习才明白,两者还是有区别的。
冒泡排序
概念
冒泡排序(Bubble Sort),可以说是知名度最高也是特别特别重要的经典排序算法。
冒泡排序和选择排序都属于交换排序算法的一种。所谓交换排序算法,是指在排序过程中,要发生数组元素的交换。
之所以要把该算法称为“冒泡算法”,这是因为每个大的元素,每次经过交换都会慢慢“浮”到数组的顶端,故名“冒泡排序”。
冒泡排序的核心思想,是把相邻的元素进行两两比较,当一个元素大于右侧相邻的元素时,就交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则保持位置不变。
注意:冒泡排序只会操作相邻的两个数据。每次冒泡操作都是对相邻的两个元素进行比较,看是否满足大小关系。
实现步骤
接下来我们就以一个数值型的数组为例,向大家介绍冒泡排序的整个排序过程。
我们现在定义一个数组,其数组元素值依次为[5,8,6,3,9,2,1,7]。
如果我们采用冒泡排序算法,按从小到大的规则对其排序,其详细过程会如下所示:
- 将5和8进行比较,因为满足左小右大的规则,不需要交换,保持元素位次不变;
- 将8和6进行比较,因不满足左小右大的规则,则需要交换。将8和6位置互换,互换位置后,元素6在下标1这个位置上,元素8在下标2这个位置上;
- 接着将8和3进行比较,不满足左小右大规则,需要交换。将8和3位置互换,互换位置后,元素3在下标2的位置上,元素8在下标3的位置上;
- 继续将8和9进行比较,满足左小右大规则,不需要交换,保持元素位次不变;
- 将9和2进行比较,不满足左小右大的规则,需要交换。将9和2位置互换,互换位置后,元素2在下标4的位置上,元素9在下标5的位置上;
- 将9和1进行比较,不满足左小右大的规则,需要交换。将9和1位置互换,互换位置后,元素1在下标5的位置上,元素9在下标6的位置上。
- 继续将9和7进行比较,不满足左小右大的规则,需要交换。互换位置后,元素7在下标6的位置上,元素9在下标7的位置上。
如果我们把上述的文字描述,转换为图片,则会如下图所示:
这样就完成了第一轮的交换比较。经过第一轮交换后,元素9作为数列中最大的元素,就像是汽水里的气泡一样浮到了最右侧。接着我们继续如此重复上述的比较过程,每一轮结束后,都会有一个本轮最大的元素被移到了最右侧,如下所示:
每一轮的排序结果最终会如上图所示,所以最终的排序结果就是最后一排的数值结果。
最后我们来总结下,冒泡排序算法的3个核心步骤:
比较相邻的元素。如果第一个元素比第二个元素大,就将两者交换;
对每一对相邻的两个元素进行同样的操作。从开始第一对到结尾的最后一对,最后的元素就是最大的数。
针对所有元素重复以上步骤。每重复一轮上述步骤,需要操作的元素就会越来越少,直到没有任何一对元素需要比较。
代码实现
算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。代码如下所示:
Array.prototype.bubble_sort = function() {var i, j, temp;for (i = 0; i < this.length - 1; i++)for (j = 0; j < this.length - 1 - i; j++)if (this[j] > this[j + 1]) {temp = this[j];this[j] = this[j + 1];this[j + 1] = temp;}return this;
}
选择排序
概念
选择排序(Selection Sort) 是一种最简单直观的排序算法。即使在我们的日常生活中,大家可能都会经常无意地进行选择排序。
例如:我们去超市买西红柿,拿了一个袋子,从众多的西红柿中挑了一个最大好的放入袋中,然后又从剩下的西红柿中挑了一个最大的放入袋子。这样如此反复,直到挑够了需要的西红柿去结账。这其实就是选择排序的实现思想,就是不断地从未排序的元素中选择最大(或最小)的元素,放入到已排好序的元素集合中,直到未排序的元素为空。
基于上述实现思想,我们就可以提取出选择排序的实现原理:
将一个数组分成有序的区间和无序的区间两部分,初始时有序区间为空,每次从无序区间中选出最小的元素,并放到有序区间的末尾,直到无序区间为空。
实现步骤
假如我们现在有一个待排序的数组[5,8,6,3,9,2,1,7]
若采用选择排序算法进行排序,其实现步骤如下:
- 初始化待排序数组[5,8,6,3,9,2,1,7];
- 从待排序数组中,选出最小值1,和第一个元素5进行交换,即将最小的元素放在下标0的位置上;
- 在剩下的无序区间的元素中,选择最小的元素2,并将最小的元素2与无序区间的第一个元素8进行交换。交换后,有序区间的元素变为2个,分别是1和2,剩余的为无序区间。
- 依次类推,将所有的元素通过不断选择的方式,按有序的方式放到有序区间,最终把整个数组全部排好顺序。
我们把上述选择排序的文字描述内容,变成对应的图片,会如下图所示:
代码实现
算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。代码如下:
function selectionSort(arr) {var len = arr.length;var minIndex, temp;for (var i = 0; i < len - 1; i++) {minIndex = i;for (var j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) { // 寻找最小的数minIndex = j; // 将最小数的索引保存}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr;
}
总结
冒泡排序属于交换排序算法的一种;
选择排序算法是原地排序算法的一种;
冒泡排序的核心思想是把相邻的元素进行两两比较,当一个元素大于右侧相邻的元素时,就交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则保持位置不变。
选择排序的实现思想,就是不断地从未排序的元素中选择最大(或最小)的元素,放入到已排好序的元素集合中,直到未排序的元素为空。
两者的区别简单了说就是冒泡排序在比较的过程中待排序的数据会发生位置改变,而选择排序法在比较过程中,是记录较大/较小数据的索引,只有在找到最大/最小数据的时候才会发生交换。
相关文章:

交换排序——选择排序和冒泡排序的区别是什么?
今天重温一下算法,其实刚开始我觉得冒泡排序和选择排序是一样的,因为他们排序过程中都是通过相邻的数据比较找到最小/最大的数据,通过不断思考和学习才明白,两者还是有区别的。 冒泡排序 概念 冒泡排序(Bubble Sort)࿰…...

吉他谱:Melodies of Life - Final Fantasy Solo Guitar Collections
原始出处: Final Fantasy Solo Guitar Collections - 南泽大介改编的最终幻想9主题曲吉他谱 更多吉他谱: https://github.com/NaisuXu/Guitar_Sheet_Music_Collection...

微信小程序下拉刷新
小程序中的下拉刷新 - 掘金...
TX2 NX 修改设备树--GPIO
确认模组内使用的是哪个设备树文件 模组上电输入如下指令,查看返回值:cat /proc/device-tree/nvidia,dtsfilename找到相应的设备树文件设备树存放路径 /public_sources/Linux_for_Tegra/source/public/kernel_src/hardware/nvidia/platform/t18x/lanai/kernel-dts 确认设备树…...

.NET对象的内存布局
在.NET中,理解对象的内存布局是非常重要的,这将帮助我们更好地理解.NET的运行机制和优化代码,本文将介绍.NET中的对象内存布局。 .NET中的数据类型主要分为两类,值类型和引用类型。值类型包括了基本类型(如int、bool、double、cha…...

Hybrid App 可以从哪些技术路径实现性能优化
说到 Hybrid App(混合应用)大家都不陌生,因为这种开发模式大行其道发展的这些年取代了很多原生和 Web 应用,为什么大家对这种「Native HTML5」的开发模式额外偏爱呢? 因为一方面在一定程度上兼顾了原生应用的优质体验…...

C++入门篇7---string类
所谓的string类,其实就是我们所说的字符串,本质和c语言中的字符串数组一样,但是为了更符合C面向对象的特性,特地将它写成了一个单独的类,方便我们的使用 对其定义有兴趣的可以去看string类的文档介绍,这里…...
2308d的静态构造函数循环依赖示例
原文 //Steve: __gshared string[string] dict; shared static this() {dict ["a" : "b"]; }这里有两个论点:这不能是CRT构造器,因为它依赖于D运行时,并且认为它应该进入自己的模块是一个QoL问题,当你想要私有到类而不是私有到模块时,可为类提供它,因为语…...

Linux 目录和文件常见操作
就常见的命令: pwd pwd 显示当前的目录 目录迁移 我以如下的目录大致结构做一个简单的例子 cd 迁移到指定的路径,可以指定相对路径和绝对路径,默认相对 .指向当前路径,…/ 指向上一级的目录。 ls 列出文件及其目录 命令选…...

不基于比较的排序:基数排序
本篇只是讨论桶排序的具体实现,想了解更多算法内容可以在我的博客里搜,建议大家看看这篇排序算法总结:排序算法总结_鱼跃鹰飞的博客-CSDN博客 桶排序的原理: 代码:sort1是一个比较二逼的实现方式浪费空间,s…...

shell和反弹shell
文章目录 是什么?bash是什么?反弹shell 是什么? Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了…...

构建Docker容器监控系统(Cadvisor +Prometheus+Grafana)
Cadvisor PrometheusGrafana 1.1、Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示。 1.2、安装docker-ce [rootloc…...

java实现文件的下载
系统日志的获取不可能每次都登录服务器,所以在页面上能够下载系统运行的日志是必须的 如何来实现日志的下载,这样的一个功能 前端我们用到的是window.open(...)这样可以发送一个get请求到后台 后台接收到get请求之后,如何实现对文件的下载 R…...

分享Python技术下AutojsPro7云控代码
引言 有图有真相,那短视频就更是真相了。下面是三大语言的短视频。 Java源码版云控示例: Java源码版云控示例在线视频 Net源码版云控示例: Net源码版云控示例在线视频亚丁号-知识付费平台 支付后可见 扫码付费可见 Python源码版云控示例…...

【Linux】网络通信
【Linux】网络通信 文章目录 【Linux】网络通信1、网络基础1.1 计算机网络1.2 网络模型TCP & UDP1)IP地址2)端口3)TCP协议与UDP协议的比较 1.3 网络传输1.3.1 传输逻辑1.3.2 传输条件1.3.3 传输流程 1.4 地址管理 2、网络编程2.1 基本概念…...

【mysql】—— 表的约束
目录 序言 (一)空属性 (二)默认值 (三)列描述 (四)zerofill (五)主键 (六)自增长 (七)唯一键 &#…...

jeecgboot 登录成功默认其他路由
util.js...

【1572. 矩阵对角线元素的和】
来源:力扣(LeetCode) 描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3]…...
GaussDB 开发篇+Java调用JDBC访问openGauss数据库
★ 数据库信息 ✔ 数据库版本:openGauss 5.0.0 ✔ 数据库端口:5432 ✔ 数据库名称:db_zzt ★ Java代码 package PAC_001;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sq…...

钕铁硼永磁材料基本概念
目录 一、何为磁性材料二、永磁材料的主要性能三、永磁材料的历史四、永磁材料的分类五、钕铁硼永磁材料5.1 产业链5.2 生产工艺 之前也写过其他行业的一些生产过程和工艺流程,大家有兴趣的可以翻翻以前的文章。 一、何为磁性材料 参加过九年义务教育的同学应该都知…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...