定义
依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
例如有个数组的长度为6,需要从小到大进行排序
第一遍: 下标0和1位置的值比较,如果0位置的值比1大,则交换;下标1和2位置的值比较,如果1位置的值比2大,则交换;下标2和3位置的值比较,如果2位置的值比3大,则交换;下标3和4位置的值比较,如果3位置的值比4大,则交换;下标4和5位置的值比较,如果4位置的值比5大,则交换。至此,第一遍比较完成,此时下标5位置的数一定是最大的,因此后面进行第二遍、第三遍……第n遍时不再需要比较该位置的数。第二遍: 下标0和1位置的值比较,如果0位置的值比1大,则交换;下标1和2位置的值比较,如果1位置的值比2大,则交换;下标2和3位置的值比较,如果2位置的值比3大,则交换;下标3和4位置的值比较,如果3位置的值比4大,则交换;至此,第二遍比较完成,此时下标4位置的数一定是第二大的,因此后面进行第三遍……第n遍时不再需要比较该位置的数。
......
以此类推
代码示例
public class CodeBubbleSort {
/**
* 从小到大排序
* @param arr
*/
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
// 考虑边界情况,数组为空或者长度小于2,则不用排序
return;
}
int n = arr.length;
for (int i = 0; i < n; i++) {
for (int j = 1; j < n - i; j++) {
if (arr[j - 1] > arr[j]) {
int temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
}
}
public static void printArr(int[] arr) {
for (int j : arr) {
System.out.print(j + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {5, 1, 6, 11, 10, 9, 45, 1, 6, 7, 9, 12};
printArr(arr);
bubbleSort(arr);
printArr(arr);
}
}
输出结果
5 1 6 11 10 9 45 1 6 7 9 12
1 1 5 6 6 7 9 9 10 11 12 45