拆分奇偶校验功能订购赔率和赔率

时间:2017-03-02 16:39:18

标签: c++ arrays sorting

我一直盯着这个,我无法弄清楚我做错了什么。我试图编写一个函数,重新排序奇数,在数组中的evens前面。赔率和平均的内在顺序并不重要[3,1,4,2]或[1,3,2,4]都是可以接受的。

目前,如果我初始化int arr[5] = {3,6,4,1,12},我会得到3,4,1,6,2的输出。努力弄清楚我做错了什么。

以下代码:

void SplitParity(int arr[], int arrSize)
{
    int tempValueHolder;

    for (int indexCounter = 0; indexCounter < arrSize; indexCounter++)
    {
        //Iterate through each index checking for odd
        if (arr[indexCounter] % 2 == 0)
        {
            tempValueHolder = arr[indexCounter];

            //If Odd.....shift all indexes forward and move current to the back
            for (int innerCounter = indexCounter; innerCounter < arrSize; innerCounter++)
                arr[innerCounter] = arr[innerCounter + 1];

            arr[arrSize - 1] = tempValueHolder;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您忘记了在移动所有内容之后,您必须再次查看indexCounter(您不知道在arr[indexCounter] = arr[indexCounter+ 1];执行时,循环的第一次迭代中到达的值是否为是否正确)

最简单的解决方法是在indexCounter --;

之后添加arr[arrSize - 1] = tempValueHolder;

它也非常低效,我建议你看一下std :: partition

答案 1 :(得分:0)

使用具有正确自定义比较功能的标准算法:

#include <iterator>
#include <iostream>
#include <algorithm>

template<class T>
bool is_odd(const T& value)
{
    if (value & 1)
        return true;
    return false;
}

struct odd_first
{
    template<class T>
    bool operator()(const T& l, const T& r) const {
        if (is_odd(l))
        {
            if (is_odd(r))
                return false;
            return true;
        }
        else
            return false;
    }
};



int main()
{
    int vals[] = { 5, 6, 7, 8, 9, 1, 2, 3, 4, 0 };

    std::sort(std::begin(vals), std::end(vals), odd_first());
    std::copy(std::begin(vals), std::end(vals), std::ostream_iterator<int>(std::cout, ", "));
    std::cout << std::endl;
}

预期产出:

5, 7, 9, 1, 3, 6, 8, 2, 4, 0, 

根据Fezvez的建议,std :: partition:

#include <iterator>
#include <iostream>
#include <algorithm>

struct is_odd
{
    template<class T>
    bool operator()(const T& value) const
    {
        if (value & 1)
            return true;
        return false;
    }
};

int main()
{
    int vals[] = { 5, 6, 7, 8, 9, 1, 2, 3, 4, 0 };

    std::partition(std::begin(vals), std::end(vals), is_odd());
    std::copy(std::begin(vals), std::end(vals), std::ostream_iterator<int>(std::cout, ", "));
    std::cout << std::endl;
}

答案 2 :(得分:0)

使用std::sortDemo

,您可以轻松完成这项工作
std::sort(std::begin(arr), std::end(arr), [](int lhs, int rhs){
    return (lhs % 2 == 1 && rhs % 2 == 0);
});

输出:

3 1 6 4 12 

或者,如果您希望在奇数和偶数内进行内部排序:Demo

std::sort(std::begin(arr), std::end(arr), [](int lhs, int rhs){
        int l_res = lhs % 2;
        int r_res = rhs % 2;
        if (l_res == r_res)
            return lhs < rhs;
        return (l_res == 1 && r_res == 0);
    });

输出:

1 3 4 6 12