一.简单的冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
public class BubbleSort { public static void main(String[] args) { int[] array = {5, 9, 7, 4, 1, 3, 2, 8}; bubbleSort(array); }
private static void bubbleSort(int[] array) { for (int j = 0; j < array.length - 1; j++) { for (int i = 0; i < array.length - 1; i++) { if (array[i] > array[i + 1]) { swap(array, i, i + 1); } } System.out.println("第" + (j + 1) + "轮排序后的数组:" + Arrays.toString(array)); } System.out.println("排序后的数组:" + Arrays.toString(array)); }
private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } }
|
结果:
我们再将每一轮排序的比较次数打印出来:
可以看见,每一轮排序都比较相同次数,这显然是多余操作的。
二.优化:减少比较次数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private static void bubbleSort(int[] array) { for (int j = 0; j < array.length - 1; j++) { for (int i = 0; i < array.length - 1 - j; i++) { System.out.println("比较次数:" + (i + 1)); if (array[i] > array[i + 1]) { swap(array, i, i + 1); } } System.out.println("第" + (j + 1) + "轮排序后的数组:" + Arrays.toString(array)); } System.out.println("排序后的数组:" + Arrays.toString(array)); }
|
结果:
可以看见比较次数逐次递减。
三.优化:减少冒泡次数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| private static void bubbleSort(int[] array) { for (int j = 0; j < array.length - 1; j++) { boolean swapped = false; for (int i = 0; i < array.length - 1 - j; i++) {
if (array[i] > array[i + 1]) { swap(array, i, i + 1); swapped = true; } } if (!swapped) { break; } System.out.println("第" + (j + 1) + "轮排序后的数组:" + Arrays.toString(array)); } System.out.println("排序后的数组:" + Arrays.toString(array)); }
|
结果:
可以看见,排序次数由七次减少到5次了。
四.优化:经一步优化比较次数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private static void bubbleSort_V2(int[] array) { int n = array.length - 1; while (true) { int last = 0; for (int i = 0; i < n; i++) { System.out.println("比较次数:" + (i + 1)); if (array[i] > array[i + 1]) { swap(array, i, i + 1); last = i; } } System.out.println("排序后的数组:" + Arrays.toString(array)); n = last; if (n == 0) { break; } } System.out.println("==========冒泡排序后:" + Arrays.toString(array));
}
|
结果:
对比第二种优化比较次数来看:比较次数更加减少了