【每天进步一点点】荷兰国旗问题2

203 阅读1分钟

荷兰国旗问题 2

前置内容:荷兰国旗问题1

荷兰国旗问题增强版:也是快速排序的前置知识

把一个数组划分为三个部分:左部分的数值小于target,中间部分等于target,右边部分大于target

例如:数组 {5,2,4,8,9,6,2,5,4,7,8,5,3} target 为 5

输出结果是:2 4 3 4 2 5 5 5 7 8 6 9 8

partition(II).png

整个过程相当于是:小于 target 的部分把 target 往右边挤。大于 target 的部分把 target 往左边挤

代码

public class 荷兰国旗问题2 {
    public static void main(String[] args) {
        int[] arr = {5,1,5,4,7,8,9,5,2,5};
        partition(arr,0,arr.length-1,5);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
    }

    public static void partition(int[] arr,int L,int R,int target) {
        int less = L-1;//最小值右侧边界
        int more = R+1;//最大值左侧边界
        int i = 0;//数组下标指针
//        while (i<R) {
        while (i < more) { //已到达最大区域就停止,如果是到达 R 再停止的话会交换重复
            if (arr[i] < target) {//小于的话,
                swap(arr,i++,++less);
            }else if (arr[i] == target) {
                i++;
            }else {
                swap(arr,i,--more);
            }
        }
    }
​
    public static void swap(int[] arr,int i,int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}