冒泡排序实现思路及优化
创始人
2025-06-01 08:55:17
0

冒泡排序,即一个无序的数组中,经过处理的数组后面的元素比前一个大。

int[] arr = new int[]{6, 2, 1, 3, 5, 4};

判断条件

arr[j] < arr[j + 1]

要做到这个,在程序中实现需要通过循环外加一个临时变量来处理

if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;
}

考虑到数组里的元素顺序发生变化,一般一次完整下来无法达到目的,数组 arr 一个完整循环排序下来的结果是

[2, 1, 3, 5, 4, 6]

显然1和2,5和4还不能满足,所以需要一个外层循环来处理这个问题

for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}
}

至此,一个简单的冒泡排序结束。

看一下哪里可以有优化的地方

从循环次数入手

发现外层循环总共30次。循环次数多意味着计算量大,消耗cpu高

减少外层循环次数

外层循环第一次排序后的数组依次为

[2, 6, 1, 3, 5, 4]
[2, 1, 6, 3, 5, 4]
[2, 1, 3, 6, 5, 4]
[2, 1, 3, 5, 6, 4]
[2, 1, 3, 5, 4, 6]

即6个元素遍历了5次,有一次不用循环

for (int i = 0; i < arr.length-1; i++) {for (int j = 0; j < arr.length - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}
}

这次循环次数为25次,(30-25)/30*100≈17%,即提升了 17%。

鉴于第一次外层循环结束后,数组最后一个值是最大的,接下来下来只需要对前面的5个元素进行比较

内层循环在现有的基础上减少外层循环次数

在上面优化的基础上,在外层循环的基础上数组后面的大小都是已经固定的。接下来每次外循环下来内循环只需要对数组未进行正常排序的进行处理即可。

for (int i = 0; i < arr.length -1; i++) {int len = arr.length - 1 -i;for (int j = 0; j < len; j++) {// 5 > 3if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}
}

这次循环次数为15次,(30-15)/30*100=50%,即相对原始算法提升了 50%,相对于第一次优化后 (25-15)/25=40%,即提升了40%。

这是这两种都无法解决重复判断的问题

把内循环的判断提到 for 循环条件上

代码如下

for (int i = 0; i < arr.length -1; i++) {int len = arr.length - 1 -i;for (int j = 0; j < len && arr[j] > arr[j + 1]; j++) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}
}

这次循环次数为6次,解决了重复循环的问题,(30-6)/30*100=80%,即相对原始算法提升了 80%,相对于第二次优化后 (15-6)/15=60%,即提升了60%。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...