一、概述:
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
二、排序版本
1.0 版:无优化
public static void bubbleSort_v1(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1; j++) {
if(arr[j ] > arr[j + 1]){
swap(arr, j , j+1);
}
}
System.out.println("第" + i + "轮冒泡====" + Arrays.toString(arr));
}
}
2.0 版:内循环减少遍历次数 ( j < arr.length - 1 - i)
public static void bubbleSort_v2(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j ] > arr[j + 1]){
swap(arr, j , j+1);
}
}
System.out.println("第" + i + "轮冒泡====" + Arrays.toString(arr));
}
}
3.0 版:使用布尔变量记录最后是否交换过,如果没交换,说明排序完成,跳出外循环
public static void bubbleSort_v3(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
boolean swap = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j ] > arr[j + 1]){
swap(arr, j , j+1);
swap = true;
}
}
System.out.println("第" + i + "轮冒泡====" + Arrays.toString(arr));
if(!swap){
break;
}
}
}
4.0 版:使用变量记录最后交换的索引,如果为0,说明交换完成,退出外循环
public static void bubbleSort_v4(int[] arr){
int n = arr.length - 1;
while (true){
//记录最后一次交换
int last = 0;
for (int i = 0; i < n; i++) {
if(arr[i] > arr[i + 1]){
swap(arr, i, i+1);
last = i;
}
}
n = last;
if(n == 0){
break;
}
}
}
交换函数:
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}