冒泡算法是最基础的算法之一,但是对于新手来说却有些理解难度,因为其用了两个for循环作为嵌套,并且第一层嵌套作为的初始值成为了第二层的判断值。
arr= {2,5,1,8,3,10,7}
对于冒泡算法,有两种习惯。,一种是for(int i=i<length-1;i>0;i–)另一种是for(int i=1;i<length;i++)
无论 选择那种都是将最大的值放在最右侧,所以以后就没有必要再对比最后一位,依次类推第二大放在倒数第二位,没有必要再与倒数第二位比较,。。。
-
for(;;i++)
首先看代码例如java
int temp=0 for(int i =1; i < arr.length; i++) { for(int j = 0; j < arr.length- i; j++) { if(arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } System.out.println("循环i="+i+" j="+j+Arrays.toString(arr)); } }
循环i=1 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=1 j=1[2, 1, 5, 8, 3, 10, 7]
循环i=1 j=2[2, 1, 5, 8, 3, 10, 7]
循环i=1 j=3[2, 1, 5, 3, 8, 10, 7]
循环i=1 j=4[2, 1, 5, 3, 8, 10, 7]
循环i=1 j=5[2, 1, 5, 3, 8, 7, 10]
循环i=2 j=0[1, 2, 5, 3, 8, 7, 10]
循环i=2 j=1[1, 2, 5, 3, 8, 7, 10]
循环i=2 j=2[1, 2, 3, 5, 8, 7, 10]
循环i=2 j=3[1, 2, 3, 5, 8, 7, 10]
循环i=2 j=4[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=2[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=3[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=2[1, 2, 3, 5, 7, 8, 10]
循环i=5 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=5 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=6 j=0[1, 2, 3, 5, 7, 8, 10]
for(;;i–)
int temp=0
for(int i = arr.length-1; i >0; i--) {
for(int j = 0; j < i; j++) {
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
System.out.println("循环i="+i+" j="+j+Arrays.toString(arr));
}
}
循环i=6 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=6 j=1[2, 1, 5, 8, 3, 10, 7]
循环i=6 j=2[2, 1, 5, 8, 3, 10, 7]
循环i=6 j=3[2, 1, 5, 3, 8, 10, 7]
循环i=6 j=4[2, 1, 5, 3, 8, 10, 7]
循环i=6 j=5[2, 1, 5, 3, 8, 7, 10]
循环i=5 j=0[1, 2, 5, 3, 8, 7, 10]
循环i=5 j=1[1, 2, 5, 3, 8, 7, 10]
循环i=5 j=2[1, 2, 3, 5, 8, 7, 10]
循环i=5 j=3[1, 2, 3, 5, 8, 7, 10]
循环i=5 j=4[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=2[1, 2, 3, 5, 7, 8, 10]
循环i=4 j=3[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=3 j=2[1, 2, 3, 5, 7, 8, 10]
循环i=2 j=0[1, 2, 3, 5, 7, 8, 10]
循环i=2 j=1[1, 2, 3, 5, 7, 8, 10]
循环i=1 j=0[1, 2, 3, 5, 7, 8, 10]
注意
第一种,在第二层for循环中一定要j<arr.length-1。因为只有首次遍历全部的时候才会完整的排序,如果写作j<i
int temp=0
for(int i =1; i < arr.length-1; i++) {
for(int j =0; j < i; j++) {
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
System.out.println("循环i="+i+" j="+j+Arrays.toString(arr));
}
}
循环i=1 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=2 j=0[2, 5, 1, 8, 3, 10, 7]
循环i=2 j=1[2, 1, 5, 8, 3, 10, 7]
循环i=3 j=0[1, 2, 5, 8, 3, 10, 7]
循环i=3 j=1[1, 2, 5, 8, 3, 10, 7]
循环i=3 j=2[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=0[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=1[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=2[1, 2, 5, 8, 3, 10, 7]
循环i=4 j=3[1, 2, 5, 3, 8, 10, 7]
循环i=5 j=0[1, 2, 5, 3, 8, 10, 7]
循环i=5 j=1[1, 2, 5, 3, 8, 10, 7]
循环i=5 j=2[1, 2, 3, 5, 8, 10, 7]
循环i=5 j=3[1, 2, 3, 5, 8, 10, 7]
循环i=5 j=4[1, 2, 3, 5, 8, 10, 7]
可以看出其输出的结果完全报错,所以要理解好其原理的同时,也要对代码实现逻辑要理解清楚
所以冒泡算好需要从其原理入手,注意两点
- 其核心理论,就是两两对比,将其需要的值放在末端
- 在嵌套的循环中,一定也是必须低循环次数一定要有多变少,否则其结果绝对会错