调整数组顺序使奇数位于偶数前面

// 面试题21:调整数组顺序使奇数位于偶数前面
    // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有
    // 奇数位于数组的前半部分,所有偶数位于数组的后半部分。
    // ====================方法一====================
    static void odd_even_1(std::vector<int>& arr)
    {
        if(arr.size()<2)
        {
            return;
        }

        uint32_t left = 0;
        uint32_t right = arr.size() - 1;

        auto temp = arr[left];
        while(left < right)
        {
            while(left < right && (arr[right] & 0x1) == 0)
            {
                right--;
            }
            arr[left] = arr[right];

            while(left < right && (arr[left] & 0x1) != 0)
            {
                left++;
            }
            arr[right] = arr[left];
        }
        arr[left]=temp;
    }

    // ====================方法二====================
    static void odd_even_1_ex(std::vector<int>& arr)
    {
        _odd_even_1_ex(arr, _is_even);
    }

    static void _odd_even_1_ex(std::vector<int>& arr, bool (*func)(int))
    {
        if(arr.size()<2)
        {
            return;
        }

        uint32_t left = 0;
        uint32_t right = arr.size() - 1;

        auto temp = arr[left];
        while(left < right)
        {
            while(left < right && func(arr[right]))
            {
                right--;
            }
            arr[left] = arr[right];

            while(left < right && !func(arr[right]))
            {
                left++;
            }
            arr[right] = arr[left];
        }
        arr[left]=temp;
    }

    static bool _is_even(int n)
    {
        return (n & 1) == 0;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值