2017-09-17 124 views
0

私は奇数と偶数を配列に分離しようとしています。しかし、それは動作していないようです。これは今までのところ関数を書いている私のアプローチです。私が偶数の入力を入れた場合にのみ動作します。例として、入力として{1,2,3,4,5,6}を入力すると{1,5,3,6,2,4}が出力されますが、入力が奇数の場合はランダムな出力を与えてくれます。コードの問題は何ですか?奇数と偶数を配列にどのように分類するのですか?

EDIT1:私は、C++での初心者です。

void segregateEvenOdd() { 

for (int i = 0; i < endofarray; i++){ 
    int temp; 
    if (array[i] % 2 == 0) //check if the number is odd or even 
     temp = array[i]; 
     for(int j = i; j <= endofarray; j++){ //start from 1 cuz we dont want to touch the numbers that are already segregated 
      array[j] = array[j+1]; 

     } 
     array[endofarray] = temp; 
} 
} 
+0

'<= endofarray'は確かungoodです。また、外側のループインデックスはあなたが遭遇した奇数の数を知らせます。 –

+0

右の "関連"リストを見ましたか? [この質問](https:// stackoverflow。com/questions/8514924 /偶数と奇数の配列の分離?rq = 1)も同様のことを求めています。 – user1118321

+2

[偶数と奇数の配列の分離]の可能な複製(https://stackoverflow.com/questions/8514924/segregating-an-array-for-even-and-odd-numbers) – akshayk07

答えて

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()を使用しています。
ゼロをゼロにする場合は、条件を調整します。
条件を正しく処理するように常に注意してください。

0

あなたの方法は非常に非効率的です。 1)奇数用と偶数用の2つのリスト(std :: list)を作成する 2)配列全体を繰り返し、odd_numsおよびeven_numsリストを埋め込む 3)上に移動するodd_numsリスト、even_numsリストの順に並べ替え、元の配列の内容を上書きします。 これはO(n)メモリを要しますが、非常に高速です。

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 

あなたは奇数番号が最初に来るしたい場合は、単に述語(b & 1) && !(a & 1)abの位置を入れ替えることができます。述語は基本的に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()); 

を偶数のベクトルと奇数のベクトルを生成します。

関連する問題