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

120 阅读1分钟

荷兰国旗问题 1

Dutch National Flag Problem 荷兰国旗问题,该问题由荷兰计算机科学家 Dijkstra 所提出

荷兰国旗问题1:

给定一个 target 值,小于等于 target 的数放左边,大于 target 的数放数组右边 例如:数组 {5,2,4,8,9,3,1},target 为 4 输出结果是:2 4 3 1 9 5 8

其中:“2 4 3 1”,是小于等于 target 的部分,放左边。“9 5 8”,是大于 target 的部分,放右边

为什么叫 “荷兰国旗”?因为荷兰国旗有三种颜色,然后这些数组里的数字相当于是这些颜色进行“分块”处理,这个数组的数字就像这个国旗一样,被拆分开来。其中这个操作的英文一般称为:partition

荷兰国旗1.png

partition(I).png

整个 partition 的过程相当于是:小于区域把大于区域往右挤

代码

public class 荷兰国旗问题1 {
    public static void main(String[] args) {
        int[] arr = {5,2,4,8,9,6,2,5,3,2,1,4,7,8,5,3,6};
        partition(arr, 0, arr.length-1,4);
        printArray(arr);
    }
    
    public static void partition(int[] arr,int L,int R,int target) {
        if (arr == null || arr.length == 1) {
            return;
        }
        int i = L; // 索引,每次前进一格
        int j = L-1; // 表示小于等于 target 的部分
        while (i <= R) {
            if (arr[i] <= target) {
                swap(arr,i++,++j);
            }else {
                i++;
            }
        }
    }
​
    public static void swap(int[] arr,int i,int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
​
    public static void printArray(int[] arr) {
        System.out.print("Array : ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
    }
}