Skip to content

本模块是公共类课程,适合绝大部分计算机岗位。由于 Java 受众最广且易读性强,本模块示例代码使用 Java 编写,其他语言也可参考学习。

冒泡排序原理

冒泡排序是一种简单的排序算法,主要思想是从头到尾依次比较相邻的两个元素,如果逆序则交换,直到没有逆序的元素为止。

冒泡排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。

冒泡排序实现

如,对数组arr = [5, 3, 8, 6, 4]进行升序冒泡排序。

设置end指向数组末尾,每一轮比较结束后,end--,或者说,end = arr.length - 轮数 - 1

每一轮让指针cur指向数组第 0 个元素,然后依次比较。

最后设置一个标志位flag,每一轮都初始化为false,如果某一轮没有发生交换,则说明数组已经有序,直接跳出循环。

排序过程如下:

  1. 第一轮

    53864
    curnext

    arr[cur] > arr[next],交换位置,flag = true

    35864
    curnext

    arr[cur] < arr[next],不交换位置

    35864
    curnext

    arr[cur] > arr[next],交换位置

    35684
    curnext

    arr[cur] > arr[next],交换位置

    35648
    cur

    cur位于end位置,跳出循环,end--

  2. 第二轮

    35648
    curnext

    arr[cur] < arr[next],不交换位置

    35648
    curnext

    arr[cur] < arr[next],不交换位置

    35648
    curnext

    arr[cur] > arr[next],交换位置,flag = true

    35468
    cur

    cur位于end位置,跳出循环,end--

  3. 第三轮

    35468
    curnext

    arr[cur] < arr[next],不交换位置

    35468
    curnext

    arr[cur] > arr[next],交换位置,flag = true

    34568
    cur

    cur位于end位置,跳出循环,end--

  4. 第四轮

    34568
    curnext

    arr[cur] < arr[next],不交换位置

    34568
    cur

    cur位于end位置,跳出循环。

    这一轮flag = false,说明数组已经有序,提前结束排序

冒泡排序代码实现

java
public void bubbleSort(int[] nums) {
    int n = nums.length;
    for (int i = 0; i < n - 1; i++) {
        boolean flag = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (nums[j] > nums[j + 1]) {
                int temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
                // 支持元祖的编程语言可以写成 (nums[j], nums[j + 1]) = (nums[j + 1], nums[j]);
                flag = true;
            }
        }
        if (!flag) {
            break;
        }
    }
}