原创

冒泡排序算法

温馨提示:
本文最后更新于 2025年01月10日,已超过 12 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

冒泡排序Bubble Sort)是一种简单直观的排序算法。它重复地遍历要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就交换彼此。重复进行遍历数列的工作直到没有再需要交换为止,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

算法步骤

1.比较相邻的元素。如果第一个比第二个大,就将两数彼此交换。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对除了上一步最大元素外的所有的元素重复以上的步骤。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码示例

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {10, 20, 11, 9, 0, -1, 13, 29, 30, 2};
        System.out.println(Arrays.toString(sort(arr)));
    }

    public static int[] sort(int[] arr) {
        if (Objects.isNull(arr) || arr.length < 2) {
            return arr;
        }
        int num = arr.length - 1;
        while (num > 0) {
            for (int i = 0; i < num; i++) {
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i + 1];
                    arr[i + 1] = arr[i];
                    arr[i] = temp;
                }
            }
            num--;
        }
        return arr;
    }
}

动图演示

BubbleSort

什么时候最快

当数组已经有序,时间复杂度为O(n),因为每次遍历都不会发生交换,算法会提前结束。

什么时候最慢

当数组完全逆序情况下

第一次需要进行n-1次比较和交换
第二次需要进行n-2次比较和交换
...

一共需要进行((n-1)+(n-2)+...+1)次比较和交换,需要进行n*(n-1)/2次比较和交换;此时排序的时间复杂度为O(n^2)

正文到此结束
本文目录