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

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

冒泡排序

概念

冒泡排序(Bubble Sort),可以说是知名度最高也是特别特别重要的经典排序算法。

冒泡排序和选择排序都属于交换排序算法的一种。所谓交换排序算法,是指在排序过程中,要发生数组元素的交换。

之所以要把该算法称为“冒泡算法”,这是因为每个大的元素,每次经过交换都会慢慢“浮”到数组的顶端,故名“冒泡排序”。

冒泡排序的核心思想,是把相邻的元素进行两两比较,当一个元素大于右侧相邻的元素时,就交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则保持位置不变。

注意:冒泡排序只会操作相邻的两个数据。每次冒泡操作都是对相邻的两个元素进行比较,看是否满足大小关系。

实现步骤

接下来我们就以一个数值型的数组为例,向大家介绍冒泡排序的整个排序过程。

我们现在定义一个数组,其数组元素值依次为[5,8,6,3,9,2,1,7]

如果我们采用冒泡排序算法,按从小到大的规则对其排序,其详细过程会如下所示:

  1. 将5和8进行比较,因为满足左小右大的规则,不需要交换,保持元素位次不变;
  2. 将8和6进行比较,因不满足左小右大的规则,则需要交换。将8和6位置互换,互换位置后,元素6在下标1这个位置上,元素8在下标2这个位置上;
  3. 接着将8和3进行比较,不满足左小右大规则,需要交换。将8和3位置互换,互换位置后,元素3在下标2的位置上,元素8在下标3的位置上;
  4. 继续将8和9进行比较,满足左小右大规则,不需要交换,保持元素位次不变;
  5. 将9和2进行比较,不满足左小右大的规则,需要交换。将9和2位置互换,互换位置后,元素2在下标4的位置上,元素9在下标5的位置上;
  6. 将9和1进行比较,不满足左小右大的规则,需要交换。将9和1位置互换,互换位置后,元素1在下标5的位置上,元素9在下标6的位置上。
  7. 继续将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]

若采用选择排序算法进行排序,其实现步骤如下:

  1. 初始化待排序数组[5,8,6,3,9,2,1,7];
  2. 从待排序数组中,选出最小值1,和第一个元素5进行交换,即将最小的元素放在下标0的位置上;
  3. 在剩下的无序区间的元素中,选择最小的元素2,并将最小的元素2与无序区间的第一个元素8进行交换。交换后,有序区间的元素变为2个,分别是1和2,剩余的为无序区间。
  4. 依次类推,将所有的元素通过不断选择的方式,按有序的方式放到有序区间,最终把整个数组全部排好顺序。

我们把上述选择排序的文字描述内容,变成对应的图片,会如下图所示:

代码实现

算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。代码如下:

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;
}

总结

  • 冒泡排序属于交换排序算法的一种;

  • 选择排序算法是原地排序算法的一种;

  • 冒泡排序的核心思想是把相邻的元素进行两两比较,当一个元素大于右侧相邻的元素时,就交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则保持位置不变。

  • 选择排序的实现思想,就是不断地从未排序的元素中选择最大(或最小)的元素,放入到已排好序的元素集合中,直到未排序的元素为空。

两者的区别简单了说就是冒泡排序在比较的过程中待排序的数据会发生位置改变,而选择排序法在比较过程中,是记录较大/较小数据的索引,只有在找到最大/最小数据的时候才会发生交换。 

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

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

相关文章

【正版系统】2023热门短剧SAAS版开源 | 小程序+APP+公众号H5

当我们在刷百度、D音、K手等各种新闻或短视频时经常会刷到剧情很有吸引力的短剧广告&#xff0c;我们点击广告链接即可进入短剧小程序&#xff0c;小程序运营者通过先免费看几集为诱耳然后在情节高潮时弹出充值或开VIP会员才能继续看的模式来赚钱&#xff0c;以超级赘婿、乡村小…

VS Code中C++程序的调试(Debug)功能

有一个.vscode文件&#xff0c;存放当前工作区相关配置文件的目录。 launch.json {"version": "0.2.0","configurations": [{"name": "gcc.exe - 生成和调试活动文件", // 该调试任务的名字&#xff0c;启动调试时会在待…

TCP/IP 下的计算机网络江湖

〇、引言 在当今数字化时代,计算机网络宛如广袤江湖,涵盖着五大门派:物理层、数据链路层、网络层、传输层和应用层。每个门派独具技能,共同构筑着现代网络的框架。物理层宛如江湖基石,将比特流传输;数据链路层如武林传承,组织数据帧传递;网络层则像导航大师,寻找传送路…

【Linux操作系统】文件描述符fd

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux之路       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1…

python单元测试框架(测试固件、批量执行)

python测试框架 在Python语言中应用最广泛的单元测试框架是unittest和pytest,unittest属于标准库&#xff0c;只要安装了Python解释器后就可以直接导入使用了,pytest是第三方的库&#xff0c;需要单独的安装。 1.白盒测试原理 在软件架构的层面来说&#xff0c;测试最核心的…

Kotlin入门:变量和函数——02

目录 一、Kotlin 基本数据类型 ​编辑 二、变量 val 关键字&#xff1a; var 关键字: 类型推断: 可空类型: 三、函数 基本函数语法&#xff1a; 单表达式函数&#xff1a; 默认参数值&#xff1a; 命名参数&#xff1a; 一、Kotlin 基本数据类型 Kotlin 的基本数…

关于selenium 元素定位的浅度解析

一、By类单一属性定位 元素名称 描述 Webdriver API id id属性 driver.find_element(By.ID, "id属性值") name name属性 driver.find_element(By.NAME, "name属性值") class_name class属性 driver.find_element(By.CLASS_NAME, "class_na…

MAUI+Blazor:隐藏标题栏和问题

文章目录 前言相关文章代码问题有必要解决吗&#xff1f; 前言 最近在研究MAUIBlazor开发&#xff0c;发现一个问题&#xff0c;原生的的标题栏实在是太丑了。 相关文章 MAUI桌面端标题栏设置和窗口调整 MAUI Windows How to completely hide the TitleBar? #15142 MAUI …

Chrome开发者工具介绍

Chrome开发者工具介绍 前言1 打开DevTools2 命令菜单3 Elements面板ConsoleJavaScript调试Network 前言 Chrome开发者工具是谷歌浏览器自带的一款开发者工具&#xff0c;它可以给开发者带来很大的便利。常用的开发者工具面板主要包含Elements面板、Console面板、Sources面板、…

数据结构——时间复杂度和空间复杂度

1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数的计算 long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2); }我们看到…

2023 互联网大厂薪资大比拼

最近整理了33家互联网大厂的薪资情况。可以看出来&#xff0c;大部分互联网大厂薪资还是很不错的&#xff0c;腾讯、阿里、美团、百度等大厂平均月薪超过30k&#xff0c;其他互联网大厂平均月薪也都在25k以上。01020304050607080910111213141516171819202122232425262728293031…

yo!这里是STL::list类简单模拟实现

目录 前言 重要接口实现 框架 默认成员函数 迭代器&#xff08;重点&#xff09; 1.引言 2.list迭代器类实现 3.list类中调用实现 增删查改 后记 前言 我们知道&#xff0c;stl中的vector对应数据结构中的顺序表&#xff0c;string类对应字符串&#xff0c;而今天要…

Unity C# 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息

Unity C# 之 Http 获取网页的 html 数据&#xff0c;并去掉 html 格式等相关信息 目录 Unity C# 之 Http 获取网页的 html 数据&#xff0c;并去掉 html 格式等相关信息 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 一、简单介绍 Unity中的一些知…

Linux网络基础(中)

目录&#xff1a; 再谈“协议” HTTP协议 认识URL&#xff1a; urlnecode和urldecode HTTP协议格式&#xff1a; HTTP的方法&#xff1a; 简易HTTP服务器&#xff1a; 传输层 再谈端口号&#xff1a; 端口号范围划分&#xff1a; netstat&#xff1a; pidof&…

Ubantu安装Docker(完整详细)

先在官网上查看对应的版本:官网 然后根据官方文档一步一步跟着操作即可 必要准备 要成功安装Docker Desktop&#xff0c;必须&#xff1a; 满足系统要求 拥有64位版本的Ubuntu Jammy Jellyfish 22.04&#xff08;LTS&#xff09;或Ubuntu Impish Indri 21.10。 Docker Deskto…

Redis基础命令大全

这里写目录标题 第一章、Redis 命令大全1.1&#xff09;通用命令语法&#xff1a;ping语法&#xff1a;dbsize语法&#xff1a;select db语法&#xff1a;flushdb语法&#xff1a;exit 或 quit语法&#xff1a;redis-cli 1.2&#xff09;Redis 的 Key 的操作命令语法&#xff1…

Elasticsearch之kibana相关命令

1.中文分词器相关命令 2.拼音分词器相关命令

服务器之LNMP

lnmp的构成 L&#xff1a;linux系统,操作系统。 N&#xff1a;nginx网站服务&#xff0c;前端,提供前端的静态页面服务。同时具有代理,转发的作用。 转发&#xff1a;主要是转发后端请求。转发到PHP。nginx没有处理动态资源的功能,他有可以支持转发动态请求的模块。 M&…

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

【数据结构•堆】堆排序(理论基础)

堆的定义  • 堆是一个完全二叉树   –所有叶子在同一层或者两个连续层   –最后一层的结点占据尽量左的位置  • 堆性质   –为空, 或者最小元素在根上   –两棵子树也是堆 存储方式  • 最小堆的元素保存在heap[1..hs]内   – 根在heap[1]   –K的左儿子是2k,…