八大基本排序---快速排序(荷兰国旗问题)

Posted yuange678

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八大基本排序---快速排序(荷兰国旗问题)相关的知识,希望对你有一定的参考价值。

引言:

技术图片

解答:

技术图片

需要准备3个下标

技术图片

如果当前数字=num,cur跳下一个

技术图片

如果数组中的当前数字<num,把这个数(3)和小于区域的下一个数(5)交换

技术图片

然后小于区域扩一下

技术图片

然后cur跳下一个位置

技术图片

数组中的当前数字<num,把这个数(2)和小于区域的下一个数(5)交换,

然后小于区域扩一下

然后cur跳下一个位置

技术图片

PS:

如果一上来遇到的就是cur<num

把这个数(3)和小于等于区域的下一个数(3)交换【自己和自己交换】

技术图片

数组中的当前数字>num,把这个数(7)和大于区域的前一个数(x)交换

然后大于区域向左扩一个位置,more移动一下

然后让cur停留在原地,继续考察换过来的x跟num的大小关系

技术图片

当cur == more的时候,整个过程停止

public class Code_08_NetherlandsFlag {

    public static int[] partition(int[] arr, int L, int R, int num) {
        int less = L - 1;
        int more = R + 1;
        while (L < more) {
            if (arr[L] < num) {
                swap(arr, ++less, L++);
            } else if (arr[L] > num) {
                swap(arr, --more, L);
            } else {
                L++;
            }
        }
        //less + 1:等于区域的第一个位置,more - 1:等于区域的最后 一个位置
        return new int[] { less + 1, more - 1 };
    }

    // for test
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

传统快排:与荷兰国旗问题类似

技术图片

import java.util.Arrays;

//利用荷兰国旗问题进行快排
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {3,1,4,5,2,2,0,13};
        System.out.println(Arrays.toString(arr));
//        int[] res = new int[2];
//        res = partition(arr, 0, arr.length-1);
//        System.out.println(res[0]+" " +res[1]);
//        System.out.println(Arrays.toString(arr));
        quickSort(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
        
    }
    
    public static void quickSort(int[] arr,int L,int R){
        if (L>=R) {
            return;
        }
        int[] p = partition(arr, L, R);
        quickSort(arr, L, p[0]-1);
        quickSort(arr, p[1]+1, R);
    }
    
    //以数组的最后一个数字arr[R]作为num
    //返回等于区域的下标
    public static int[] partition(int[] arr,int L ,int R){
        int less = L-1;
        int more = R+1;
        int num = arr[R];
        while (L < more) {
            if (arr[L]==num) {
                L++;
            }else if (arr[L]<num) {
                swap(arr,++less,L++);
            }else if (arr[L]>num) {
                swap(arr,L ,--more );
            }
        }
        int[] res = {less+1,more-1};
        return  res;
    }
    
    public static void swap(int[] arr, int i, int j ){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

}

以上是关于八大基本排序---快速排序(荷兰国旗问题)的主要内容,如果未能解决你的问题,请参考以下文章

荷兰国旗-快速排序应用

那些可以用快速排序秒杀的经典题

LeetCode 数组:75. 颜色分类(计数排序 荷兰国旗问题)

LeetCode经典题型总结

八大排序算法总结

八大排序算法总结:快速排序