冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置
示例图:
正常编码
public class BubbleSort {
public static void main(String args[]) {
int[] arr = {
1, 5, 2, 67, 46, 24, 90, 33 };
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
结果:
排序次数如下:
0:[1, 5, 2, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 46, 67, 24, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
4:[1, 2, 5, 24, 33, 46, 67, 90]
4:[1, 2, 5, 24, 33, 46, 67, 90]
4:[1, 2, 5, 24, 33, 46, 67, 90]
5:[1, 2, 5, 24, 33, 46, 67, 90]
5:[1, 2, 5, 24, 33, 46, 67, 90]
6:[1, 2, 5, 24, 33, 46, 67, 90]
[1, 2, 5, 24, 33, 46, 67, 90]
优化一
public class BubbleSort {
public static void main(String args[]) {
int num = 0;
int[] arr = {
1, 5, 2, 67, 46, 24, 90, 33 };
for (int i = 0; i < arr.length; i++) {
boolean sorted = true;// 有序标记,每一轮的初始是true
num = i;
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
sorted = false; // 有元素交换,所以不是有序,标记变为false
}
System.out.println(num + ":" + Arrays.toString(arr));
}
if (sorted) {
break;
}
}
}
}
结果:
排序次数
0:[1, 5, 2, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 46, 67, 24, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
优化二
public class BubbleSort {
public static void main(String args[]) {
int num = 0;
int[] arr = {
1, 5, 2, 67, 46, 24, 90, 33 };
int lastExchangeIndex = 0;// 最后一次比较交换的位置
int sortBorder = arr.length - 1;// 无序数列的边界,每次比到这里就行
for (int i = 0; i < arr.length; i++) {
boolean sorted = true;// 有序标记,每一轮的初始是true
num = i;
for (int j = 0; j < sortBorder; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
sorted = false; // 有元素交换,所以不是有序,标记变为false
lastExchangeIndex = j; // 把无序数列的边界更新为最后一次交换元素的位置
}
System.out.println(num + ":" + Arrays.toString(arr));
}
sortBorder = lastExchangeIndex;
if (sorted) {
break;
}
}
}
}
结果:
排序次数:
0:[1, 5, 2, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 46, 67, 24, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
故事的程序员 生命不息,撸码不止~