交换排序——选择排序和冒泡排序的区别是什么?

今天重温一下算法,其实刚开始我觉得冒泡排序和选择排序是一样的,因为他们排序过程中都是通过相邻的数据比较找到最小/最大的数据,通过不断思考和学习才明白,两者还是有区别的。
冒泡排序
概念
冒泡排序(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 生产工艺 之前也写过其他行业的一些生产过程和工艺流程,大家有兴趣的可以翻翻以前的文章。 一、何为磁性材料 参加过九年义务教育的同学应该都知…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
