解题思路
计数排序
统计每一个数字出现的次数,即0、1、2出现的次数。然后按顺序放回数组。即计数排序的思路,适用于元素个数非常有限的排序算法。
public void sortColors(int[] nums) {//长度为3的count数组记录每个数字出现的次数int[] count = {0,0,0};for(int i:nums){count[i]++; //遍历统计每个数字出现的次数}//重新写回数组int index = 0;for(int i=0;i<count[0];i++)nums[index++]=0;for(int i=0;i<count[1];i++)nums[index++]=1;for(int i=0;i<count[2];i++)nums[index++]=2;}//time O(n)//space O(1)
三路快排

确保0出现开始的位置,2出现在尾部的位置,1出现在0之后的位置
- arr[0,…zero]记录已经放好位置的0的个数,arr[two….n-1]记录已经放好位置的2的数组。
- i元素用来进行遍历,确保arr[zero+1…i-1]的位置上都是1.
- e是当前扫描到的元素,如果是1,直接纳入1的数组中,i++
- 如果是2,与two数组前面的元素进行交换,并且two—。
- 如果是0,把zero+1的位置的元素与当前元素交换位置即可,zero++,i++
public void sortColors(int[] nums) {int zero = -1; //因为arr[0,,,zero]表示0的部分,所以初始化为-1int two = nums.length; //因为arr[two,...n-1]表示2的部分,所以初始化为 nums.lengtfor(int i=0;i<two;){if(nums[i]==1){i++;}else if(nums[i]==0){zero++;swap(nums,zero,i);i++;}else{two--;swap(nums,two,i);}}}public void swap (int[] nums,int i,int j){int temp = nums[i];nums[i]=nums[j];nums[j]=temp;}
