冒泡排序(Bubble Sort)

91 阅读2分钟

20231106_114902[00h00m00s-00h00m20s].gif

冒泡排序只会操作相邻的两个数据

每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为 O(1),是一个原地排序算法。

在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法。

最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了,所以最好情况时间复杂度是 O(n)。而最坏的情况是,要排序的数据刚好是倒序排列的,我们需要进行 n 次冒泡操作,所以最坏情况时间复杂度为 O(n2)。平均情况下的时间复杂度就是 O(n2)。

image.png

// 冒泡排序,a表示数组,n表示数组大小
public void bubbleSort(int[] a, int n) {
  if (n <= 1) return;
 
 for (int i = 0; i < n; ++i) {
    // 提前退出冒泡循环的标志位
    boolean flag = false;
    for (int j = 0; j < n - i - 1; ++j) {
      if (a[j] > a[j+1]) { // 交换
        int tmp = a[j];
        a[j] = a[j+1];
        a[j+1] = tmp;
        flag = true;  // 表示有数据交换      
      }
    }
    if (!flag) break;  // 没有数据交换,提前退出
  }
}

public class BubTest {
    public static void main(String[] args) {
        // 创建一个数组实例用于排序
        int[] array = {4,5,6,3,2,1};
        // 打印原始数组
        System.out.println("排序前:");
        printArray(array);

        // 创建排序类的实例并调用冒泡排序方法
        BubTest sorter = new BubTest();
        sorter.bubbleSort(array, array.length);

        // 打印排序后的数组
        System.out.println("排序后:");
        printArray(array);
    }

    // 冒泡排序,a表示数组,n表示数组大小
    public void bubbleSort(int[] a, int n) {
        if (n <= 1) return;

        for (int i = 0; i < n; ++i) {
            // 提前退出冒泡循环的标志位
            boolean flag = false;
            for (int j = 0; j < n - i - 1; ++j) {
                if (a[j] > a[j+1]) { // 交换
                    int tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;
                    flag = true;  // 表示有数据交换
                }
            }
            // 打印每一轮排序后的数组
            System.out.print("排序过程" + (i + 1) + ":");
            printArray(a);
            if (!flag) break;  // 没有数据交换,提前退出
        }
    }

    // 打印数组方法
    private static void printArray(int[] array) {
        for (int value : array) {
            System.out.print(value + " ");
        }
        System.out.println();
    }
}

image.png

学习:极客时间《数据结构与算法之美》学习笔记