冒泡排序

164 阅读1分钟

最简单的冒泡排序:

public void sort(int[] a) {
    for (int i = a.length - 1; i > 0; i--) {
        for (int j = 0; j < i; j++) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

外层循环优化:用flag标志位来判断是否已经有序,不必继续遍历(增加一个变量,典型的空间换时间,增加了时间复杂度的稳定性)

public void sort(int[] a) {
    for (int i = a.length - 1; i > 0; i--) {
        boolean flag = true;
        for (int j = 0; j < i; j++) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                flag = false;
            }
        }
        if (flag) {
            break;
        }
    }
}

内层循环再优化:用pos标志位来判断内层循环需要跑到那个位置结束(增加一个变量,典型的空间换时间,增加了时间复杂度的稳定性)

public void sort(int[] a) {
    int pos = 0;
    int k = a.length - 1;
    for (int i = 0; i < a.length - 1; i++) {
        boolean flag = true;
        for (int j = 0; j < k; j++) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                pos = j;
                flag = false;
            }
        }
        if (flag) {
            return;
        }
        k = pos;
    }
}