码迷,mamicode.com
首页 > 编程语言 > 详细

三色排序

时间:2016-01-28 00:28:44      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:

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

    }

};

 

三色排序

标签:

原文地址:http://www.cnblogs.com/shirley-ict/p/5164887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!