image.png

解题思路

计数排序

统计每一个数字出现的次数,即0、1、2出现的次数。然后按顺序放回数组。即计数排序的思路,适用于元素个数非常有限的排序算法。

  1. public void sortColors(int[] nums) {
  2. //长度为3的count数组记录每个数字出现的次数
  3. int[] count = {0,0,0};
  4. for(int i:nums){
  5. count[i]++; //遍历统计每个数字出现的次数
  6. }
  7. //重新写回数组
  8. int index = 0;
  9. for(int i=0;i<count[0];i++)
  10. nums[index++]=0;
  11. for(int i=0;i<count[1];i++)
  12. nums[index++]=1;
  13. for(int i=0;i<count[2];i++)
  14. nums[index++]=2;
  15. }
  16. //time O(n)
  17. //space O(1)

三路快排

image.png
确保0出现开始的位置,2出现在尾部的位置,1出现在0之后的位置
image.png

  • 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++
  1. public void sortColors(int[] nums) {
  2. int zero = -1; //因为arr[0,,,zero]表示0的部分,所以初始化为-1
  3. int two = nums.length; //因为arr[two,...n-1]表示2的部分,所以初始化为 nums.lengt
  4. for(int i=0;i<two;){
  5. if(nums[i]==1){
  6. i++;
  7. }else if(nums[i]==0){
  8. zero++;
  9. swap(nums,zero,i);
  10. i++;
  11. }else{
  12. two--;
  13. swap(nums,two,i);
  14. }
  15. }
  16. }
  17. public void swap (int[] nums,int i,int j){
  18. int temp = nums[i];
  19. nums[i]=nums[j];
  20. nums[j]=temp;
  21. }