荷兰国旗问题 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
整个 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] + " ");
}
}
}