我一直盯着这个,我无法弄清楚我做错了什么。我试图编写一个函数,重新排序奇数,在数组中的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;
}
}
}
答案 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::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