三色排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三色排序相关的知识,希望对你有一定的参考价值。

题目大意:

给你红,白,蓝三种颜色的数组,要求按照红、白、蓝的顺序排序,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;

    }

};

 

以上是关于三色排序的主要内容,如果未能解决你的问题,请参考以下文章

排序练习题:三色排序

java 荷兰三色旗或者红白蓝排序问题

第2章 排序 | | 第17节 三色排序练习题

荷兰国旗-快速排序应用

三色图算法和常数

编程之法:面试和算法心得(荷兰国旗)