冒泡排序(Bubble Sort)
一、排序动画:
https://visualgo.net/zh/sorting
二、冒泡排序概念:
冒泡排序(Bubble Sort):是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
三、冒泡排序动画图:
四、实现思路:
举例:int[] arr = {5, 2, 4, 1, 3};
第一层循环:
是确定遍历的轮数,每一趟排序都能确定一个最大的元素。共执行 arr -1 趟排序。
第二层循环:
相邻元素依次两两比较(大的往后移,小的往前移。即交换位置)
如:5 和 2 比较,交换位置(2,5,4,1,3),
5 和 4 比较,交换位置(2,4,5,1,3),
5 和 1 比较,交换位置(2,4,1,5,3),
5 和 3 比较,交换位置(2,4,1,3,5)
到这里就完成了第一趟排序,第二趟排序同理。
可能很多人不理解为什么第二层循环要进行 arr - i -1 , 简单说就是每一轮排序完都能确定一个最大的元素。 如第一轮确定最大元素 5 , 第二轮确定最大元素 4(”[2, 1, 3, 4, 5]“), 第三轮....,所以就相当于数组后面的元素已经排好序了不需要再进行比较交换(即该层循环是控制每轮的比较次数)。
Java实现步骤:
五、实现代码:
BubbelSort.java
/**
* @Author hzs - 冒泡排序
* @date 2023/5/31 11:03
* @Version 1.0
*/
public class BubbelSort {
public static void main(String[] args) {
int[] arr = {5, 2, 4, 1, 3};
System.out.println("排序前:" + Arrays.toString(arr));
bubbelSort(arr);
System.out.println("排序后: " + Arrays.toString(arr));
}
public static void bubbelSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { // 进行 arr.length - 1 趟已经完成排序,所以最后一轮不需要遍历。
for (int j = 0; j < arr.length -1 - i; j++) { // -1-i 是因为后面的元素已经排好序了,所以不需要再次遍历。
if (arr[j] > arr[j + 1]) { // 相邻元素依次比较(小的往前移,大的往后移。即交换位置)
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
System.out.println("第 " + (i + 1) + " 轮排序:" + Arrays.toString(arr));
}
}
}
输出如下:
排序前:[5, 2, 4, 1, 3]
第 1 轮排序:[2, 4, 1, 3, 5]
第 2 轮排序:[2, 1, 3, 4, 5]
第 3 轮排序:[1, 2, 3, 4, 5]
第 4 轮排序:[1, 2, 3, 4, 5]
排序后: [1, 2, 3, 4, 5]
由上可知实际上只要进行 3 轮排序就能完成冒泡排序算法(甚至更少轮),已经排好序的也不需要再次排序,因此以上实现方式、包括性能方面等还可以再进一步优化。
技术水平有限,如有错误,欢迎指正!