周文佳语强化班

荷兰国旗问题与快速排序

2019-11-23  本文已影响0人  林博伦

荷兰国旗问题

即以最后一个元素进行划分,将一组数据分成三个区域,分别是小于区、等于区、大于区
时间复杂度为:O(N)

Java代码实现

    public static void partition(int[] arr,int L,int R) {
        int less = L-1;
        int more = R;
        while(L < more) {
            if(arr[L] < arr[R]) {
                swap(arr, ++less, L++);
            }else if(arr[L] > arr[R]) {
                swap(arr,--more,L);
            }else {
                L++;
            }
        }
        swap(arr,more,R);
    }
    
    public static void swap(int[] arr,int i, int j)
    {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

快速排序

快速排序即是荷兰国旗的一个延申,进行递归调用

Java代码实现

    public static void quickSort(int[] arr, int L, int R) {
        if(L < R) {
            swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
            int[] p = partition(arr, L, R);
            quickSort(arr, L, p[0]-1);
            quickSort(arr, p[1] + 1, R);
        }
    }
    
    public static int[] partition(int[] arr,int L,int R) {
        int less = L-1;
        int more = R;
        while(L < more) {
            if(arr[L] < arr[R]) {
                swap(arr, ++less, L++);
            }else if(arr[L] > arr[R]) {
                swap(arr,--more,L);
            }else {
                L++;
            }
        }
        swap(arr,more,R);
        return new int[]{less+1, more};
    }
    
    public static void swap(int[] arr,int i, int j)
    {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
上一篇 下一篇

猜你喜欢

热点阅读