三色排序

题目大意:

给你红,白,蓝三种颜色的数组,要求按照红、白、蓝的顺序排序,leetcode链接:https://leetcode.com/problems/sort-colors/

思路1:

直接给整个数组排序,时间复杂度O(nlogn)

思路2:

计数排序方法,使用一个类似hash的数组纪录每种颜色的个数,然后进行排序,但是需要遍历原数组两遍

思路3:

使用三个指针,p1表示红色和白色的分界线,p2表示白色和蓝色的分界线,i表示当前元素

即0~p1-1是红色的,p1~i-1表示白色的,p2+1~n-1表示蓝色的

1)如果当前元素是红色的,则和p1所指向的元素进行交换,由于交换以后i所指的颜色是白色的,则i直接遍历下一个元素

2)如果当前元素是蓝色的,则和p2所指向的元素进行交换,由于交换以后i所指的颜色可能是白色的,也可能是红色的,因此需要回退i

实现代码如下:注意i应该在[p1,p2]之间

class Solution

{

public:

    void sortColors(vector<int>& nums)

    {

    int n = nums.size();

    if(n <= 1)

    {

    return;

    }

 

    int p1 = 0;

    int p2 = n - 1;

    // 注意i的循环条件

    for(int i=0; i<=p2; ++i)

    {

    if(nums[i] == 0)

    {

    swap(nums[p1], nums[i]);

    ++p1;

    }

    else if(nums[i] == 2)

    {

    swap(nums[p2], nums[i]);

    --p2;

    --i;

    }

    }

    }

private:

    void swap(int &a, int &b)

    {

    int tmp = a;

    a = b;

    b = tmp;

    }

};

 本题还可以利用hash的方式进行排序,代码如下:

class Solution
{
public:
    void sortColors(vector<int>& nums)
    {
        int n = nums.size();
        vector<int> hash(3, 0);
        for(int i=0; i<n; ++i)
        {
            hash[nums[i]]++;
        }

        int index = 0;
        for(int i=0; i<3; ++i)
        {
            for(int j=0; j<hash[i]; ++j)
            {
                nums[index++] = i;
            }
        }
    }
};
原文地址:https://www.cnblogs.com/shirley-ict/p/5164887.html