3.冒泡排序-java

普通冒泡

j 的取值(j += 1):
第一次冒泡:0~4
第二次冒泡:0~3
第三次冒泡:0~2
第三次冒泡:0~1
第五次冒泡:0

j 的上限可通过 i(从 0 ~ 数组长度的值) 和 n (数组的长度)进行控制:
第一次冒泡:4
第二次冒泡:3
第三次冒泡:2
第三次冒泡:1
第五次冒泡:0


import java.util.Arrays;

public class Sort {
    public void bubbleSort(int[] data) {
        int n = data.length;
        for (int i = 0; i < n; i++) {
            //进行两两比较
            for (int j = 0; j < n - i - 1; j++) {
                if (data[j] > data[j+1]) {
                    int tmp = data[j];
                    data[j] = data[j+1];
                    data[j+1] = tmp;
                }
            }

        }
    }
    public static void main(String[] args) {
        int[] data = new int[] {3, 5, 4, 1, 2, 6};
        Sort a = new Sort();
        a.bubbleSort(data);
        int[] data2 = new int[] {1, 2, 3, 4, 5, 6};
        System.out.println(Arrays.equals(data, data2));
    
    }
}

提前退出

利用 flag 提前退出

3, 5, 4, 1, 2, 6


import java.util.Arrays;

public class Sort {
    public void bubbleSort(int[] data) {
        int n = data.length;
        boolean flag = false;
        for (int i = 0; i < n; i++) {
            // 进行两两比较
            for (int j = 0; j < n - i - 1; j++) {
                if (data[j] > data[j + 1]) {
                    int tmp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = tmp;
                    flag = true;
                }
            }
            if (!flag)
                break;

        }
    }

    public static void main(String[] args) {
        int[] data = new int[] { 3, 5, 4, 1, 2, 6 };
        Sort a = new Sort();
        a.bubbleSort(data);
        int[] data2 = new int[] { 1, 2, 3, 4, 5, 6 };
        System.out.println(Arrays.equals(data, data2));

    }
}

时间复杂度

  • 最好:O(n)
  • 最坏:O(n2)
  • 平均:O(n2)

空间复杂度

O(1)

稳定性

稳定: