【白话排序算法】冒泡排序法

news/2024/5/19 21:14:04 标签: 算法, 数据结构, 快速排序, 排序算法

冒泡排序是一种非常容易理解的排序方式。比如以下的待排序数组:

var seq = [9, 2, 6, 4, 3, 1, 7, 5, 6];

通过对数组进行遍历,每一趟遍历都依次从左至右两个两个的元素进行比较,若二者次序不正确,就交替二者的位置,描述起来略显枯燥,请看以下图例:
在这里插入图片描述
上图由左至右,为一趟排序,观察9这个数字其实已经排序到最终的位置。而且整个过程是不是像9这个数字从底部上升到顶部?其实次大的7也会在第二趟排序中从他现有的位置上升到顶部第二的位置。整体就像一个个气泡从水底逐渐冒泡到顶部的过程,故名冒泡排序。

可以看到冒泡排序的核心就是每一趟遍历若前者大于后者,则交换二者的位置。当遍历完成即完成了排序的过程,下面我用javascript语言来实现:

function bubbleSort(seq) {
	let i, j, temp;
	// 这里之所以倒着遍历,最因为每一趟遍历都确定了最后一个元素。
	// 倒着遍历恰好能够子遍历中的截止元素索引
	for (i=seq.length; i > 0; i--) {
		for (j=1;j<i;j++) {
			if (seq[j] < seq[j-1]) {
				// 若次序不对就交换位置
				temp = seq[j];
				seq[j] = seq[j-1];
				seq[j-1] = temp;
			}
		}
	}
}
bubbleSort(seq)
console.log(seq) // [1, 2, 3, 4, 5, 6, 6, 7, 9 ]

怎么样,够简单吧。但是呢,还有一个可优化的点。即若序列本身已经是有序的,那么冒泡排序一趟下来实际上并未发生任何交换。而且之后的每一趟都不会发生交换。

即,若在某一趟排序完成之后,若发现本趟排序并未移动任何元素。那么可以认定当前的序列已经有序。

接下来稍微改动一下代码如下:

function bubbleSort(seq) {
	let i, j, temp, flag = 1; // 添加一个标志位flag
	// 这里之所以倒着遍历,最因为每一趟遍历都确定了最后一个元素。
	// 倒着遍历恰好能够子遍历中的截止元素索引
	for (i=seq.length; i > 0 && flag; i--) {
		flag = 0; // 假设已经有序,如果后续发现不是有序,会改变这个标志位。
		for (j=1;j<i;j++) {
			if (seq[j] < seq[j-1]) {
				// 若次序不对就交换位置
				temp = seq[j];
				seq[j] = seq[j-1];
				seq[j-1] = temp;
				flag = 1; // 本趟遍历存在位置交换,还需继续遍历
			}
		}
		console.log('遍历了一次'); //测试若已经有序的序列,仅仅执行一次遍历
	}
}
const res = [1,2,3,4,5,6,7]
bubbleSort(res) // 遍历了一次
console.log(res); // [1, 2, 3, 4, 5, 6, 6, 7, 9 ]

如上,若队列已经有序,仅仅会执行一次遍历。所以冒泡排序也适合那种本身已经部分有序的情况。


http://www.niftyadmin.cn/n/1383044.html

相关文章

俄罗斯新法案要求所有消息应用内置加密后门

俄罗斯杜马提出的一项新法案强制性要求所有消息应用内置加密后门&#xff0c;以便于联邦安全局能够访问。WhatsApp、Viber和Telegram等消息应用都提供了不同程度的加密&#xff0c;它们都是俄罗斯新反恐法案的目标。违反该法的企业将面临100万卢布的罚款。 俄罗斯参议员Yelena …

为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍

基于OpenCV编写图像处理项目&#xff0c;除了算法以外&#xff0c;比较重要一个问题就是界面设计问题。对于c语系的程序员来说&#xff0c;一般来说有QT/MFC两种考虑。QT的确功能强大&#xff0c;特别是QML编写android界面很有一套&#xff08;https://www.cnblogs.com/jsxyhel…

【百度地图API】制作多途经点的线路导航——路线坐标规划

一、创建地图 首先要告诉大家的是&#xff0c;API1.2版本取消密钥&#xff0c;取消服务设置&#xff0c;大家可以采用更加简短的方式引用API的JS啦~ <script type"text/javascript" src"http://api.map.baidu.com/api?v1.2"></script> 大家跟…

cacti 报错 Expected some arguments after 'COMMENT:'

2019独角兽企业重金招聘Python工程师标准>>> 将0.8.7g版本的cacti升级到0.8.8b版本后发现其中有一个图无法正常出图&#xff0c;rrdtool报错ERROR: Expected some arguments after COMMENT: 百度了一下有几个帖子描述过这个问题&#xff0c;是cacti的一个BUG&#x…

【白话排序算法】希尔/谢尔排序法

谢尔排序法&#xff08;Shell’s Sort&#xff09;又称缩小增量排序法。他在1959年由谢尔&#xff08;D.L.Shell&#xff09;提出的。当时主流的排序算法时间复杂度都是O(n2)O(n^2)O(n2)。谢尔排序是有望突破这个复杂度的一批算法之一。题外话&#xff0c;对比现在如此多O(nlog…

功能测试报告的编写(版本测试报告与总结测试报告的应用)

测试报告是 测试人员在测试过程中用于反映测试状况的文档&#xff0c;其重要性通过网上哀求、跪求、旋转360度冰天雪地各种求测试报告模块的帖子中就可见一斑。其实测试报告的 内容基本都是模板的那些&#xff0c;只是在实际测试过程中&#xff0c;如何去整理内容结构&#xff…

《React Native 精解与实战》书籍连载「React Native 网络请求与列表绑定」

此文是我的出版书籍《React Native 精解与实战》连载分享&#xff0c;此书由机械工业出版社出版&#xff0c;书中详解了 React Native 框架底层原理、React Native 组件布局、组件与 API 的介绍与代码实战&#xff0c;以及 React Native 与 iOS、Android 平台的混合开发底层原理…

瑞士HUBER+SUHNER收购光交换机供应商Polatis

光纤连接领域的领先供应商&#xff0c;瑞士HuberSuhner日前宣布&#xff0c;公司已经在2016年5月30日同意收购光交换机供应商Polatis。 此次交易预计在6月完成&#xff0c;但是具体交易条款尚未透露。 总部位于贝德福德和剑桥的私有企业Polatis拥有员工110名。自成立以来&#…