1. 程式人生 > >快速排序及其改進

快速排序及其改進

快速排序的平均時間複雜度為O(N logN),空間複雜度O(logN)。

在待排序的陣列正好是正序或逆序時,時間空間複雜度為O(n^2),達到最快時間複雜度。

1.傳統快速排序

1.荷蘭國旗問題及三向切分

將小於num的數放在左邊,大於num放在右邊,等於num放在中間

3.隨機快速排序

 //隨機快速排序
    private void quickSort(int[] a){
        if (a == null || a.length < 2) return;
        quickSort(a, 0, a.length - 1);
    }

    private void quickSort(int[] a, int l, int r){
        if (l < r){
            swap(a, l + (int)Math.random() * (r - l + 1), r);
            int[]  p = partition(a, l, r);
            quickSort(a, l, p[0] - 1);
            quickSort(a, p[1] + 1, r);
        }
    }

    private int[] partition(int[] a, int l, int r){
        int left = l - 1;
        int right = r;
        int cur = l;
        int num = a[r];
        while(cur < right){
            if (a[cur] < num){
                swap(a, ++left, cur++);
            } else if (a[cur] > num){
                swap(a, --right, cur);
            } else {
                cur++;
            }
        }
        swap(a, right, r);
        return new int[]{left + 1, right};
    }

    private void swap(int[] a, int i, int j){
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }