荷兰国旗问题
荷兰国旗包含三种颜色:红、白、蓝。
有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列。它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素、等于切分元素、大于切分元素,而该算法是将数组分成三个区间:等于红色、等于白色、等于蓝色。
1. 按颜色进行排序
75. Sort Colors (Medium)
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
题目描述:只有 0/1/2 三种颜色。
项目源码
package order;
/**
* @Author Janson
* @Date 2022/2/17 11:58
* @Version 1.0
*/
/**
* 荷兰国旗问题
* 荷兰国旗包含三种颜色:红、白、蓝。
*
* 有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列。它
* 其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:
* 小于切分元素、等于切分元素、大于切分元素,
* 而该算法是将数组分成三个区间:等于红色、等于白色、等于蓝色。
* 1. 按颜色进行排序
* 75. Sort Colors (Medium)
*
* Leetcode / 力扣
*
* Input: [2,0,2,1,1,0]
* Output: [0,0,1,1,2,2]
* 题目描述:只有 0/1/2 三种颜色。
*/
public class Order4_sortColors {
public static void main(String[] args) {
int[] nums = new int[]{2,0,2,1,1,0};
/**
* 方法思路:
* 双指针法进行排序,遍历数组,将值最大的交换在数组尾部位置
* 将值最小的交换在开头位置,值居中的不做处理,继续遍历
*
*/
int left = -1,traver = 0,right = nums.length;
while (traver < right){
if (nums[traver] == 0){
swap(nums,++left,traver++);
}else if(nums[traver] == 2){
swap(nums,--right,traver);
}else {
traver++;
}
}
for (int num: nums) {
System.out.print(num + " ");
}
}
private static void swap(int[] nums,int traver,int right){
int temp = 0;
temp = nums[traver];
nums[traver] = nums[right];
nums[right] = temp;
}
}