问题解析
- 冒泡排序的概念
冒泡排序:将一组无序数列,通过一次次将未排序的数列中每两个元素进行比较,若与计划的顺序相反,就将两个元素的位置调转过来。
这个过程像泡泡从水中的某个位置一直浮到表面上一样,故称之为冒泡排序。
- 如何实现冒泡排序
冒泡排序是从一组数列的首端或尾端两个相邻的元素进行比较,一直冒泡到另一端时,就把最低位或最高位的数字找出来并放到相应的位置上了。这个冒泡的过程就可以编写一个循环。
从第二次循环开始,已经排序过的这些最大值 / 最小值元素就不需要继续排序,这个范围会逐渐扩大,我们把这个范围也写一个循环,套在冒泡的循环以外,这个循环执行的次数,就是冒泡排序的总次数啦。
解题思路
给冒泡排序的方法命名为 bubbleSort ,首次确定我们这次冒泡排序的方向为从后往前,那我们需要在数组中找的就是未排序部分的最小值,通过冒泡把它排到最前面去。
设定 [0 , bound] 为已排序区间的范围,[bound , length] 为待排序区间。外层 for 循环把bound设定初始值为 0 , 当bound小于输入数组 arr 的长度时, bound向右移动一位。
内层循环负责冒泡:i 初始位置在最右端,当 i > bound 时,i 向左移动一位。循环里内部是喜闻乐见的调换位置操作。这样, 冒泡排序的方法就写完啦。
输入数组: 2 1 6 9 3 7
第一次排序:bound = 0;
数组变化:
2 1 6 9 3 7
2 1 6 3 9 7
2 1 3 6 9 7
2 1 3 6 9 7
1 2 3 6 9 7
第二次排序:bound = 1;
…
public static void main(String[] args) {
int[] arr = {2, 1, 6, 9, 3, 7};
bubbleSort (arr);
for (int x : arr) {
System.out.println(x);
}
}
public static void bubbleSort(int[] a) {
//从后往前排最小
//[0, bound) 已排序区间
//[bound, length) 待排序区间
for (int bound = 0; bound < a.length; bound++) {
for (int i = a.length - 1; i > bound; i--) {
if (a[i] < a[i - 1]) {
int tmp = a[i - 1];
a[i - 1] = a[i];
a[i] = tmp;
}
}
}
}
容易出现的运行异常就是数组越界,只要记住,arr[n] 里的 n 只能在 [0 , arr.length) 之间即可。