leetcode 75 Sort Colors 计数排序,三路快排

解法一:计数排序:统计0,1,2 的个数

时间复杂度:O(n)

空间复杂度:O(k)    k为元素的取值范围, 此题为O(1)

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int count[3] = {0};  //存放0,1,2三个元素的频率
        for(int i=0;i<nums.size();i++){
            assert(nums[i] >=0 && nums[i]<=2);  //若不符合条件则报错
            count[nums[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;
    }
};

解法二:三路快排

时间复杂度:O(n)

空间复杂度:O(1)

只遍历了一遍

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int zero = -1; //nums[0...zero] == 0 , 即设置初始状态为无效的数组
        int two = nums.size();  //nums[two...n-1] ==2, 初始化two==n
        for(int i=0;i<two;){
            //有一部分i不需要++
            if(nums[i] == 1)
                i++;
            else if(nums[i] ==2){
                two -- ; //two移位到前一位,即还没有处理的元素上
                
                //将two前的还未排序的元素与2交换位置
                swap(nums[i],nums[two]); 
                
            }
            else{
                //nums[i] == 0
                assert(nums[i] ==0);
                zero ++ ;
                //zero++后指向的是1,相当于将1和0交换位置,所以i++
                swap(nums[zero],nums[i]);  
                i++;
            }
        }
    }
};
原文地址:https://www.cnblogs.com/Bella2017/p/10125087.html