复习下冒泡顺便发到CSDN记录下日常。
个人感觉冒泡排序理解了概念以后写起来简单,
主要是要先理解冒泡排序的概念,就是从后往前或者从前往后两两比较相邻元素的值,再选择交不交换位置,从下述倒叙排列理解:即一轮比较结束后即可选出数组元素最小值放到数组的末尾,
以
int[] b = {666,3223,234,83,53,87,5,4,3,2,999};
为例, 666小于3223 互换位置,666大于234位置不变,234大于83,省略······
一轮循环后可得,
[3223, 666, 234, 83, 87, 53, 5, 4, 3, 999, 2]
即只需要进行数组长度length-1次循环即可成功排列出递减数组序列,
每次两两比较也需要比较length-1次,
由此我们只需要一个for循环负责控制需要循环多少趟,在里面嵌套一个for循环负责控制本趟的循环次数。
b[] 数组总共有11个数组元素,则我们就需要两两比较10趟数组,每趟比较10次,我们直接用.length方法来调用数组长度,减去1是因为计算是从零开始的。
for (int i = 0; i < b.length - 1; i++) {
for (int j = 0; j < b.length - 1; j++) {
至此冒泡循环的核心双重嵌套循环就出来啦,剩下的flag或者counts都是优化外层循环次数所加的额外代码,可以直接删去。
菜鸟程序员一名!欢迎大家交流互动,指导批评。
完整代码如下:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
/**
* 作者:西瓜
* Date:2021年4月8日19:44:24
* 冒泡排序
* 每一趟循环都将相邻元素比较大小并交换相应位置,最终选出本趟循环的max或min值放在首位
* 经过两次嵌套循环,时间复杂读为O(n*2)
*/
int[] b = {666,3223,234,83,53,87,5,4,3,2,999};
int counts=0;
for (int i = 0; i < b.length - 1; i++) {
boolean flag = false; //判断本次是否进行了元素交换,默认为false.
for (int j = 0; j < b.length - 1; j++) {
counts++;
if(b[j]<b[j+1]){
int temp = b[j];
b[j]=b[j+1];
b[j+1]=temp;
flag = true;
}
}
if(flag==false){
break;//如果此轮循环未发生交换 则说明数组已经是有序数列,优化外层循环次数。可以通过注释此段代码观察counts的变化来理解。
}
}
/**
* 如果直接sout(b)会输出数组第一个元素的地址
* 此时可用for循环遍历整个数组或者使用Arrays的toString()方法
*/
System.out.println(Arrays.toString(b));
System.out.println(counts);
}
}