快速排序及其改进

快速排序的平均时间复杂度为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;
    }
 
 

你可能感兴趣的:(算法)