原理介绍
对一组数组通过相邻之间的比较,把大的不断往后移实现从小到大的排序方式。
代码解析
循环的比较涉及次数用for循环来表达最合适,单轮的比较用内循环for,多轮的执行用外循环for。
这里数组为a,j是外层循环,i是内存循环。
这里数组的长度是8,也就是有8个数进行了比较,两两比较总共进行了7轮,也就是a.length()-1,同时执行完一轮后最大值在末尾,下一轮的比较只到这一轮-1的地方。
- j外层循环,从a.length()-1开始递减
- i内层循环,从下标0到j-1
- i循环作用是把一个大值,推到最后位置(这里也就是j位置)
- i循环执行过程中,一些较大值,也会向右移动(外层循环不用执行7轮)
- i和i+1位置比较大小,i位置大,两个位置的值交换
public class BubbleSort {
public static void main(String[] args) {
int[] a={5,8,4,9,1,3,4,7};
System.out.println(Arrays.toString(a));
sort(a);
//System.out.println(Arrays.toString(a));
}
private static void sort(int[] a) {
for (int j = a.length-1;j>0 ; j--) {
boolean flag=false;//还没有执行交换
for (int i = 0; i <j; i++) {
if(a[i]>a[i+1]){
int tmp=a[i];
a[i]=a[i+1];
a[i+1]=tmp;
flag=true;//有交换改成true
}
}
//flag==false
if(!flag){
break;
}
//判断条件,判断数据已经拍完,如果已经排完则跳出循环
System.out.println(Arrays.toString(a));
}
}
}
public class BubbleSort2 {
public static void main(String[] args) {
int[] a={2,6,5,1,7,6,2,9,4,2};
System.out.println(Arrays.toString(a));
sort(a);
//System.out.println(Arrays.toString(a));
}
private static void sort(int[] a) {
for (int i =0;i< a.length-1;i++) {
boolean flag=false;//还没有执行交换
for (int j = 0; j <a.length-1-i; j++) {
if(a[i]>a[i+1]){
int tmp=a[i];
a[i]=a[i+1];
a[i+1]=tmp;
flag=true;//有交换改成true
}
}
//flag==false
if(!flag){
break;
}
//判断条件,判断数据已经拍完,如果已经排完则跳出循环
System.out.println(Arrays.toString(a));
}
}
}
- 这里是两种循环条件的写法方式,其他一致。