C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列内の0を先頭へ、1を末尾へ移動する方法を解説

このチュートリアルでは、配列内のすべての0を先頭に移動し、すべての1を末尾に移動するプログラムをC++で作成する方法を解説します。

問題として、0と1がランダムな整数と混在した配列が与えられます。この配列に対して、すべての0を配列の先頭へ、すべての1を配列の末尾へ移動させる必要があります。まずは具体例を見てみましょう。

入力

arr = [4, 5, 1, 1, 0, 0, 2, 0, 3, 1, 0, 1]

出力

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

アルゴリズム

  • 配列を初期化します。

  • インデックス変数を0で初期化します。

  • 与えられた配列を先頭から順に走査します。

    • 現在の要素が1でない場合、その値を現在のインデックス位置に書き込みます。

    • 書き込んだ後にインデックスを1つ進めます。

  • 走査終了後のインデックス位置から配列の末尾(n)までの残りの要素を、すべて1で埋めます。これにより、すべての1が配列の末尾に集まります。

  • 次に、0についても同様の処理を行います。今度は配列を末尾から先頭方向へ走査し、インデックスを増やす代わりに減らしながら非ゼロ要素を詰めていくことで、すべての0を配列の先頭に移動させます。

実装

以下は、上記のアルゴリズムをC++で実装したコードです。

#include <bits/stdc++.h>
using namespace std;
void update1And0Positions(int arr[], int n) {
    int index = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] != 1) {
            arr[index++] = arr[i];
        }
    }
    while (index < n) {
        arr[index++] = 1;
    }
    index = 0;
    for (int i = n - 1; i >= 0; i--) {
        if (arr[i] == 1) {
            continue;
        }
        if (!index) {
            index = i;
        }
        if (arr[i] != 0) {
            arr[index--] = arr[i];
        }
    }
    while (index >= 0) {
        arr[index--] = 0;
    }
}
int main() {
    int arr[] = { 4, 5, 1, 1, 0, 0, 2, 0, 3, 1, 0, 1 };
    int n = 12;
    update1And0Positions(arr, n);
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    return 0;
}

出力

上記のコードを実行すると、次の結果が出力されます。

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

このアルゴリズムは、配列を2回走査するだけで目的の並べ替えが完了するため、時間計算量はO(n)、追加のメモリを使用しないため空間計算量はO(1)という効率的なアプローチになっています。

  1. C++で配列を分割し、先頭部分を末尾に移動するプログラムの書き方

    この記事では、配列を指定した位置で分割し、分割した先頭部分を配列の末尾に移動させる方法を解説します。例として、配列の内容が {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} である場合を考えます。この配列を2つの部分に分割します。1つ目の部分はインデックス0から3まで(分割サイズ4)、2つ目の部分は残りです。先頭部分を末尾に追加すると、配列は {4, 5, 6, 7, 8, 9, 0, 1, 2, 3} のようになります。これは実質的に「左回転(left rotation)」と呼ばれる操作であり、先頭の要素を1つずつ取り出して末尾に移動する処理を、分割サイズ分だけ繰り返すことで実現

  2. C#で整数配列内のすべての0(ゼロ)を配列の末尾に移動する方法

    C#では、整数型の配列に含まれるすべての0を配列の末尾へ移動したいケースがあります。例えば { 0, 1, 0, 3, 12 } という配列を { 1, 3, 12, 0, 0 } のように並べ替える処理です。本記事では、効率的なアルゴリズムでこの問題を解決する MoveZeros メソッドの実装方法を解説します。アルゴリズムの考え方基本的なアプローチは以下の通りです。まず MoveZeros メソッドを作成し、配列を先頭から順に走査します。走査の過程で0以外の要素を検出したら、それを配列の前方から順番に詰めていきます。次に、非ゼロ要素を格納し終えた位置から配列の末尾までを、すべて0で埋めます