原理
临近的数字两两进行比较,按照从小到大(或者从大到小)的顺序进行交换,
这样一趟过去后,最大(或最小)的数字被交换到了最后一位,
然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子。
算法的关键是,循环几趟,每趟比较几次
例子
从小到大排序
原始待排序数组| 7 | 3 | 2 | 1 | 4 | 9 |
第一趟排序(外循环)
第一次两两比较7 > 3交换(内循环)
交换前状态| 7 | 3 | 2 | 1 | 4 | 9 |
交换后状态| 3 | 7 | 2 | 1 | 4 | 9 |
第二次两两比较,7 > 2交换
交换前状态| 3 | 7 | 2 | 1 | 4 | 9 |
交换后状态| 3 | 2 | 7 | 1 | 4 | 9 |
第三次两两比较,7 > 1交换
交换前状态| 3 | 2 | 7 | 1 | 4 | 9 |
交换后状态| 3 | 2 | 1 | 7 | 4 | 9 |
第四次两两比较,7 > 4交换
交换前状态| 3 | 2 | 1 | 7 | 4 | 9 |
交换后状态| 3 | 2 | 1 | 4 | 7 | 9 |
第五次两两比较,7 < 9不交换
交换前状态| 3 | 2 | 1 | 4 | 7 | 9 |
交换后状态| 3 | 2 | 1 | 4 | 7 | 9 |
第二趟排序(外循环)
第一次两两比较3 > 2交换
交换前状态| 3 | 2 | 1 | 4 | 7 | 9 |
交换后状态| 2 | 3 | 1 | 4 | 7 | 9 |
第二次两两比较,3 > 1交换
交换前状态| 2 | 3 | 1 | 4 | 7 | 9 |
交换后状态| 2 | 1 | 3 | 4 | 7 | 9 |
第三次两两比较,3 < 4不交换
交换前状态| 2 | 1 | 3 | 4 | 7 | 9 |
交换后状态| 2 | 1 | 3 | 4 | 7 | 9 |
第四次两两比较,4 < 7不交换
交换前状态| 2 | 1 | 3 | 4 | 7 | 9 |
交换后状态| 2 | 1 | 3 | 4 | 7 | 9 |
第三趟排序(外循环)
第一次两两比较2 > 1交换
交换后状态| 2 | 1 | 3 | 4 | 7 | 9 |
交换后状态| 1 | 2 | 3 | 4 | 7 | 9 |
第二次两两比较,2 < 3不交换
交换后状态| 1 | 2 | 3 | 4 | 7 | 9 |
交换后状态| 1 | 2 | 3 | 4 | 7 | 9 |
第三次两两比较,3 < 4不交换
交换后状态| 1 | 2 | 3 | 4 | 7 | 9 |
交换后状态| 1 | 2 | 3 | 4 | 7 | 9 |
第四趟排序(外循环)无交换
第五趟排序(外循环)无交换
排序完毕,输出最终结果| 1 | 2 | 3 | 4 | 7 | 9 |
参考代码
/** * @Description:冒泡排序算法实现 */ public class BubbleSort { public static void bubbleSort(int[] arr) { if (arr == null || arr.length == 0) return; //冒泡排序是通过相邻的比较和交换 //算法的关键是,循环几趟,每趟比较几次 for (int i = 0; i < arr.length - 1; i++) { System.out.println("i======"+i); for (int j = arr.length - 1; j > i; j--) { System.out.println("j======"+j); if (arr[j] < arr[j - 1]) { swap(arr, j - 1, j); } } } System.out.println("结果为=========================="); for (int i : arr) { System.out.println(i); } } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {4,5,2,1,5,4}; new BubbleSort().bubbleSort(arr); } }