代码的世界虽逻辑繁华,却又大道至简。
什么是冒泡排序
网上有很多实现冒泡算法的文章,看了都觉得大同小异,我相信大家看到最多的是这样一句话来阐述什么是冒泡排序 "依次比较相邻的两个数,然后将小的数放在前面,大的数放在后面(或者大数放前面,小数放后面)",没错,核心思想就是这样,但核心思想仅仅就只是核心思想,而一般我们所看到的代码一上来就是这段优化过后的实现,比如:
public static void main(String[] args) {
int[] a = { 6, 3, 7, 2, 10, 5 };
int temp;
boolean changed = false;
for (int i = 0; i < a.length - 1; i++) {
changed = false;
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
changed = true
}
}
if(!changed){
break;
}
}
System.out.println(Arrays.toString(a));
}
对于以上代码,如果你是初学者亦或者未理解透时,你或许会有这样的疑问:为什么第二重循环这里 为什么要减 i ?我相信在网上看到大多数文章要么就没提,要么一带而过亦或者本来就是非初学者,如果你也只是强记不去完全理解,下次直接搬出来或让你直接写,大概率你会发现依旧是看不懂或是写不出来的。
这里为了让大家更加理解冒泡排序,当然更是为了让自己以后便于快速复习冒泡排序,我对网上看到的文章进行一个整理与总结。
参考链接:https://blog.csdn.net/q5706503/article/details/82851752
怎么理解以上冒泡程序
要理解以上冒泡排序就要理解2个优化点:
1.‘a.length - 1 - i ’怎么理解
2.变量changed 作用是什么
对于‘a.length - 1 - i ’的理解其实就是:
第1次遍历数组,把最大数的挑出来放在最后(此时最后1位已经完成,后续不再比较)
第2次遍历数组,把第二大的数挑出来放在倒数第二(此时最后2位已经完成,后续不再比较)
那么,假设有N个数,当遍历第N遍后,也就像冒泡一样从小到大排好序了。
我们用一张图来形象表示下:
(来自以上标注的参考链接文章中).gif
对于变量changed
其实就是例如类似这样的数组:
int[] a = { 1,2,3,4,5,6,7,8};
int[] b = { 8,1,2,3,4,5,6,7};
int[] c = { 8,1,3,2,4,5,6,7};
因为它们的数据变化比较小,n个数据只需遍历0次或者1~2次就可以了,不需要遍历n次。changed变量就是为了优化达到无需或少遍历的情况,避免性能浪费。
总结:
当数据量小时 时间复杂度不明显,当数据量大时,以上2点的优化可以很大程度上提升程序的性能。
我相信当看到这里时,你已经完全理解了冒泡排序,并能自己写出来了,所以:











网友评论