浅析图解算法之冒泡排序

03 冒泡排序 为描述方便,用下面的数组模拟小朋友的交换过程。 核心思想(升序):
从首位置开始,依次比较前后两个数,如果前面的数比后面的数大,就交换两个数。这样第1轮结束后,最大的数就会移动到最后的位置。对剩余元素重复执行n-1次,整个数组有序。因为像空气上浮到水面,最大的元素会慢慢浮到最后,所以冒泡因此得名。
3.1 第1轮 执行完成后,最大的元素归位。
3.2 第2轮 第2轮接着对前面剩余的n-1个元素重复上面步骤,第2大的元素归位。
3.3 第3轮 第3轮对前面剩余的n-2个元素重复上面步骤,第3大的元素归位。 总共执行n-1次操作,所有元素归位。
3.4 代码实现
for (int i = 0; i 《 n - 1; ++i) { for (int j = 0; j 《 n - i - 1; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); } } } 04 问题及优化
4.1 迭代轮次优化 如果原数组为如下情况,那么在执行完第1轮后,整个数组已经有序,后面的轮次没必要执行,可以针对这种情况做一次优化改进。 改进点1: 如果某一轮没有发生过交换,说明数组已经有序,那么以后也不会发生交换,此时可以终止迭代。 代码实现
for (int i = 0; i 《 n - 1; ++i) { // flag标记是否有交换 bool flag = true; for (int j = 0; j 《 n - i - 1; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); flag = false; } } if (flag) { break; } }
4.2 扫描范围优化 如果为以下情况,我们会发现最后的6和8所处的位置和最终排序完成的位置一样,说明过程中他们的位置不会发生变化。 上一轮最后交换的位置,在下一轮时,此位置后面的数也不会再发生交换。 改进点2: 记录每一次最后发生交换的位置,下一轮只需要扫描到此位置的前一个即可。 代码实现
// 记录最后交换的位置 int position = 0; int len = n - 1; for (int i = 0; i 《 n - 1; ++i) { // flag标记是否有交换 bool flag = true; for (int j = 0; j 《 len; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); flag = false; position = j; } } len = position; if (flag) { break; } }
05 总结
冒泡排序是比较简单的一种排序算法,核心思想就是比较相邻的两个数,但效率比较低所以可做一些优化。时间复杂度为o(n^2),数据规模较小时可采用,但数据过大时就不建议采用冒泡了。


pcb板材料有那些
华为新品发布会6月2日举行,鸿蒙系统一同发布
电能管理系统的概念及意义
浅析歌尔新一代扬声器技术
最新编程语言排名:Python 超越 Java 排名第一
浅析图解算法之冒泡排序
奥迪将增加未来五年电动汽车预算
2021年第十六届“中国芯”集成电路产业促进大会 暨“中国芯”优秀产品征集结果发布仪式在珠海开幕
NVIDIA公布一条“大新闻:NVIDIA DLSS支持深度学习抗锯齿技术
我国液压、气压动力机械企业营收呈增长态势,未来发展趋势如何
DARPA无人机群具备无通信和GPS信号的作战能力
能力风暴教育机器人:主宰机器人行业的未来
6种常用防反接电路介绍
智能制造工程深入实施 试点示范持续扩围
你愿意一年换一部安卓 还是直接购买苹果三年不换呢?
变压器正常运行和巡视?
漏电保护器电路图
目前国内补锂、预锂化的相关技术发展分析
元宇宙虚拟数字人将进入快速发展时期
关于电气火灾监控管理系统的设置要点的分析