实现只有0、1、2三种元素的排序

题目:

一个数组只有0,1,2,如何把0放首位,1放后面,2放中间

example:

输入:[0, 1, 2, 0, 1, 2]

输出:[0, 0, 2, 2, 1, 1]

解析:

假设,我们有三个指针:p0、p1、p2。p0从左侧开始,指向第一个非0的数字;p1从右侧开始,指向第一个非1的数字。p2从p1开始遍历,如果是2,p2继续遍历,直到p2遇到0或者1:

  • 如果遇到0,则和p0进行交换,然后p0向右移动,指向第一个非0的数字
  • 如果遇到1,则和p1进行交换,然后p1向左移动,指向第一个非1的数字

代码:

void sort(vector<int> &vec)
{
    int len = vec.size();
    int p0 = 0;
    int p1 = len - 1;
    int p2 = 0;

    while (p2 <= p1)
    {
        if (vec[p2] == 2)
            ++p2;
        else if (vec[p2] == 0)
        {
            swap(vec[p2], vec[p0]);
            while (p0 <= p1 && vec[p0] == 0)
                ++p0;
            if (p2 < p0)
                p2 = p0;
        }
        else if (vec[p2] == 1)
        {
            swap(vec[p2], vec[p1]);
            while (p2 <= p1 && vec[p1] == 1)
                --p1;
        }
    }
}

代码2:

解析:

向左扫描所有0,向右扫描所有1,然后将所有2都放在中间。

void sort(vector<int> &vec)
{
    int size = nums.size();
    if (size <= 1)
        return;
    int p0 = 0;
    int p1 = size - 1;
    for (int i = 0; i <= p1; ++i)
    {
        while (nums[i] == 1 && i < p1) swap(nums[i], nums[p1--]);
        while (nums[i] == 0 && i > p0) swap(nums[i], nums[p0++]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值