剑指offer之数组划分

1.数组划分O(n)复杂度

按照一定规则,划分数组,使得满足规则的元素排列在数组前段,不满足规则的排列在后段

  • 比如奇数排在偶数前,那么规则就是n&1==1

  • 比如负数排在非负数前,那么规则就是n<0

  • 代码不难,难在扩展性思路,规则可以随意变化,代码主体不变

2.代码

bool rule_func(int n)
{
    //规则函数,满足规则的排在前面
    return n&1 == 1;//n是奇数,表示奇数在前面
    //return n % 3 == 0;//n是3的倍数,表示3的倍数排在前面
}

void partion(int* p, unsigned int length, bool (*rule_func)(int))
{
    if(p==NULL || length<=0)
        return;

    int* begin = p;
    int* end = p + length - 1;

    while(begin < end)
    {
        while(begin < end && rule_func(*begin))//满足规则,往后移,找到一个不满足规则(想要在后面去)的
            begin ++;

        while(begin < end && !rule_func(*end))//不满足规则,往前移,找到第一个满足规则(想要在前面去)的
            end --;

        if(begin < end)
        {
            int temp = *begin;
            *begin = *end;
            *end = temp;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值