基本思想
- 比较相邻的两个元素,如果第一个数比第二个数大,则将这两个数交换位置。第一次遍历结束,最大的数放在最后位置。因此剩下的比较中不需要再将它参与进来。
- 第二次遍历时,最大的数放在倒数第二个位置。剩下的比较以此类推,直到没有任何一对数字需要比较为止。
原理分析
红色的数字为正在比较的数字,原始数组如下:
- 第一次循环
1.首先比较a[0]和a[1]。因为28>12,所以交换这两个数的位置,交换后的数组如下:
2.继续比较a[1]和a[2]。因为32>28,所以位置不变,如图所示:
3.继续比较a[2]和a[3]。因为32>21,所以交换位置,如图所示:
4.继续比较a[3]和a[4]。因为31>14,所以交换位置,如图所示:
第一次循环结束,可以看出第一次循环我们需要比较4次,即:(a.length - 1)次 - 第二次循环
1.首先比较a[0]和a[1]。因为12<28,所以位置不变,如图所示:
2.继续比较a[1]和a[2]。因为28>21,所以交换位置,如图所示:
3.继续比较a[2]和a[3]。因为28>14,所以交换位置,如图所示:
剩下的循环以此类推。。。
结论
1.通过上面的循环可知:循环的次数为:数组元素个数 - 1,则循环次数可以表示为:
for(int i = 0; i < a.length - 1;i++) //最外层循环
2.在上文的第二次循环中,我们可以将每次循环的比较次数表示为:
a.length - 1 - (已经结束的循环次数)
用具体的例子展示,每次循环需要比较的次数为:
第一次循环:a.length - 1 - 0;
第二次循环:a.length - 1 - 1;
第三次循环:a.length - 1 - 2;
......
通过对上面内容分析可以看出,“已经结束的循环次数”刚好与最外层循环的变量 i 相等,即每次循环的比较次数为:
for(int j = 0; j < a.length - 1 - i;j++)
3.两两数字比较交换的代码如下:
if(a[j] >a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
最好将temp定义在循环体外,不然每一次循环都需要定义一次。
整体代码
import java.util.Arrays;
public class Demo {
public static int numbers[] = new int[]{28,12,32,21,14}; //定义一个数组
public static int temp = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0; i < numbers.length - 1;i++){ //最外层循环控制循环次数
for(int j = 0; j < numbers.length - 1 - i;j++){ //内层循环控制每次循环中的比较次数
if(numbers[j] >numbers[j+1]){
temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(numbers));
}