如何隔离数组中的奇数和偶数?

时间:2017-09-17 05:06:18

标签: c++ arrays

我试图在数组中分隔奇数和偶数。但是,它似乎不起作用。到目前为止,这是我编写函数的方法。它只有在我输入偶数输入时才有效。例如,如果我输入{1,2,3,4,5,6}作为输入,那么它给我{1,5,3,6,2,4}作为输出但如果我给出奇数个输入那么它给了我一些随机输出。代码有什么问题?

edit1:我是c ++的初学者。

Select

3 个答案:

答案 0 :(得分:2)

实际上有一种标准算法:

#include <algorithm>
#include <ciso646>
#include <cmath>
#include <iostream>
#include <iterator>

int main()
{
  int xs[] = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 };

  std::stable_partition( std::begin(xs), std::end(xs), []( int x ) 
  { 
    return x and ((std::abs(x) % 2) == 0);
  } );

  for (int x : xs) std::cout << x << " "; 
  std::cout << "\n";
}

这将为您提供正确的订购:

-4 -2 2 4 -5 -3 -1 0 1 3 5

如果相对顺序无关紧要,请使用std::partition()
如果您希望零被视为偶数,请调整条件。
务必小心处理好条件。

答案 1 :(得分:0)

你的方式非常低效。 我建议你做以下事情: 1)创建两个列表(std :: list):一个用于奇数,一个用于偶数 2)迭代数组并填充odd_nums和even_nums列表 3)遍历odd_nums列表,然后遍历even_nums列表,并覆盖原始数组的内容。 这需要O(n)内存,但速度非常快。

答案 2 :(得分:0)

这是一种使用std::vector和库算法的方法,因为在C ++中,通常最好使用库容器,如std::vector而不是原始数组,因为它们通常是更安全,与标准库的设计更兼容,并具有有效增长的动态尺寸:

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

int main() {
    std::vector<int> iVec { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::sort(iVec.begin(), iVec.end(), [](int a, int b) { return (b & 1) && !(a & 1); });

    return 0;
}

它会对矢量进行排序,使得偶数在前半部分,而奇数在后半部分。打印时:

std::copy(iVec.begin(), iVec.end(), std::ostream_iterator<int>(std::cout, " "));

输出结果为:

0 2 4 6 8 10 1 3 5 7 9

如果您希望奇数首先出现,您可以简单地在谓词a中交换b(b & 1) && !(a & 1)的位置。谓词基本上检查b是否为奇数而a是否为,并且结果将传递给std::sort算法,该算法将对其后的元素进行排序。

如果您之后想要将偶数和奇数分成单独的容器,您可以使用find_if算法查找第一个奇数,并从给定范围构造两个向量:

auto it = std::find_if(iVec.begin(), iVec.end(), [](int a) { return (a & 1); });
std::vector<int> evenNumbers(iVec.begin(), it);
std::vector<int> oddNumbers(it, iVec.end());

这将生成一个偶数的向量,一个具有奇数的向量。