import java.util.Arrays;

public class SortColors {
    //方法一:直接调库
    public void sortColors1(int[] nums) {
        Arrays.sort(nums);
    }

    //方法二:基于选择排序的一种实现
    public void sortColors2(int[] nums) {
        //定义一个指针,指向当前应该填入元素的位置
        int cur = 0;

        //1.遍历数组,将所有的0交换到起始位置
        for (int i = 0; i <nums.length ; i++) {
            if(nums[i]==0){
                swap(nums,cur++,i);
            }
        }

        //2.遍历数组,将所有的1交换到中间位置
        for (int i = 0; i <nums.length ; i++) {
            if(nums[i]==1){
                swap(nums,cur++,i);
            }
        }
    }
    private static void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }

    //方法三:基于计数排序的一种实现
    public void sortColors3(int[] nums) {
        int count0 = 0,count1 = 0;

        //遍历数组,统计0,1,2个数
        for (int num : nums) {
            if(num==0){
                count0++;
            }else if(num==1){
                count1++;
            }
        }

        //将0,1,2按照个数依次放入nums数组
        for (int i = 0; i <nums.length ; i++) {
            if(i<count0){
                nums[i] = 0;
            }else if(i<count1+count0){
                nums[i] = 1;
            }else{
                nums[i] = 2;
            }
        }
    }

    //方法四:基于快排排序的一种实现
    public void sortColors(int[] nums) {
        //定义左右指针
        int left = 0,right =  nums.length-1;

        //定义一个遍历所有元素的指针
        int i = left;

        //循环判断,遍历元素
        while (left<right&&i<=right){
            //1.如果是2,换到末尾,右指针左移
            while (i<=right&&nums[i]==2){
                swap(nums,i,right--);
            }

            //2.如果是0,换到头部,左指针右移
            if(nums[i]==0){
                swap(nums,i,left++);
            }

            //3.i++  继续遍历
            i++;
        }
    }
    public static void main(String[] args) {
        int[] nums = {2,0,2,1,1,0};
        SortColors sortColors = new SortColors();
        sortColors.sortColors(nums);
        for (int num : nums) {
            System.out.print(num+"\t");
        }
    }
}