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");
}
}
}