十大排序算法(一),冒泡排序

Posted by zhoujie on April 24, 2021

图解思路

最大/小的数 冒泡 到最后面

17400545-534a0b911f89ebbf.gif

假设数组长度 n

  1. 比较相邻2位, 大的数交换到右边, 直到第 n 个数也完成交换
  2. n 减一 (第1步使得最大的数冒泡到了最右边)
  3. 继续 1~2, 直到 n = 1

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        // n 轮
        for (int i = length - 1; i > 0; i--) {
            boolean isSwap = false;
            // 两两比较
            for (int j = 0; j < i; j++) {
                if (array[j] > array[j + 1]) {
                    doSwap(array, j, j + 1);
                    isSwap = true;
                }
            }

            if (!isSwap) {
                return;
            }
        }

时间复杂度

O(n) ~ O(n^2)

最差: 当数组混乱无序时

f(n) = n (n-1) / 2 = O(n^2)

最好: 当数组基本有序, 只需要一轮比对就行

f(n) = n = O(n)

空间复杂度

O(1), 不需要分配多余的空间

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class BubbleSort {

    private static void sort(int[] array) {
        if (array == null || array.length == 1) {
            return;
        }
        int length = array.length;


        for (int i = length - 1; i > 0; i--) {
            boolean isSwap = false;
            for (int j = 0; j < i; j++) {
                if (array[j] > array[j + 1]) {
                    doSwap(array, j, j + 1);
                    isSwap = true;
                }
            }

            if (!isSwap) {
                return;
            }
        }
    }

    private static void doSwap(int[] array, int x, int y) {
        int t = array[x];
        array[x] = array[y];
        array[y] = t;
    }

    public static void main(String[] args) {
        int[] array = {111, 52, 77, 98, 36, 12, 13, 48};
        sort(array);
        System.out.println(arrayToString(array));
    }

    private static String arrayToString(int[] array) {
        StringBuilder builder = new StringBuilder();
        for (int t : array) {
            builder.append(t + " ");
        }
        return builder.toString();
    }
}


-->