排序算法-冒泡排序

105 阅读3分钟

1 概述

  冒泡排序(Bubble Sort)是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。

2 原理

  从第一个元素开始,相邻比较,把较大的数值替换到后面,直到最后一个元素,然后再从第一个元素开始,相邻比较,把较大的数值替换到后面,直到倒数第二个元素,依此类推。

  假设待排序的数组为:

image.png

  先将91、60做比较,并把大的数值排到后面:

image.png

  再将91、96比较,并把大的数值排到后面:

image.png

  再将96、13比较,并把大的数值排到后面:

image.png

  再将96、35比较,并把大的数值排到后面:

image.png

  依此类推,第一轮全部排完后,结果为:

image.png

  然后进行第二轮冒泡,依然从第一、二个元素开始,先将60、91进行比较:

image.png   然后再将91、13进行比较:

image.png

  依此类推,相邻比较,但不比较最后一个元素,第二轮比较后结果为:

image.png

  然后进行第三轮、第四轮,直到冒泡到第1个元素截止,此时会发现,整个数组已经是有序数组了:

image.png

3 代码示例

/**
 * 互换顺序
 *
 * @param nums      数组
 * @param srcIndex  源下标
 * @param descIndex 目标下标
 * @author Korbin
 * @date 2022-10-17 18:20:51
 **/
private static void swap(int[] nums, int srcIndex, int descIndex) {
    int tmp = nums[srcIndex];
    nums[srcIndex] = nums[descIndex];
    nums[descIndex] = tmp;
}

/**
 * 冒泡排序
 *
 * @param nums 输入
 * @author Korbin
 * @date 2022-10-11 18:10:28
 **/
public static void bubbleSort(int[] nums) {

    int length = nums.length;
    if (length > 1) {
        // 如果数组只有1位则直接返回
        for (int i = nums.length - 1; i > 0; i--) {

            for (int j = 0; j < i; j++) {
                if (nums[j] > nums[j + 1]) {
                    swap(nums, j, j + 1);
                }
            }
        }
    }
}

4 优化思路

  如上所述,从后往前进行冒泡,那么可能会碰到一种情况:排序到某一个元素时,其前面的所有元素均是有序数据,不需要再排序了。

  这种情况,就无需再浪费时间和空间进行排序,直接返回即可得到有序数据,而要实现也比较简单:每轮冒泡时,判断是否有进行过位置调整,若未进行,则表示前面的元素均为有序数据,代码实现如下:

/**
 * 冒泡排序
 *
 * @param nums 输入
 * @author Korbin
 * @date 2022-10-11 18:10:28
 **/
public static void bubbleSort(int[] nums) {

    int length = nums.length;
    if (length > 1) {
        for (int i = nums.length - 1; i > 0; i--) {
            // 如果数组只有1位则直接返回
            boolean doSort = false;
            for (int j = 0; j < i; j++) {
                if (nums[j] > nums[j + 1]) {
                    swap(nums, j, j + 1);
                    doSort = true;
                }
            }

            // 如果未进行过顺序调整,则表示前面的元素均为有序元素
            if (!doSort) {
                break;
            }
        }
    }
}