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

Pythonで配列をパリティ(偶数・奇数)ごとに並べ替える方法

問題の概要

いくつかの数値を含む配列 A が与えられたとします。この配列を、偶数が先頭に集まり、その後に奇数が続くように並べ替えます。

たとえば、配列が A = [1, 5, 6, 8, 7, 2, 3] の場合、期待される結果は [6, 8, 2, 1, 5, 7, 3] のようになります。

解法のアプローチ:2つのポインタを使う

この問題は、いわゆる「2ポインタ法」と呼ばれるシンプルな手法で効率よく解けます。配列を一度だけ走査しながら、偶数を見つけるたびに配列の前方へ移動させていく考え方です。

具体的には、次の手順に従います。

  • インデックス i := 0 と j := 0 を初期化する
  • j が配列の長さ未満である間、以下を繰り返す
    • arr[j] が偶数であれば、arr[i] と arr[j] を入れ替え、i を 1 増やす
    • j を 1 増やす
  • 最後に arr を返す

ここで i は「次に偶数を置くべき位置」を指し、j は現在チェック中の要素を指します。偶数が見つかるたびに先頭側へスワップしていくことで、自然と偶数が前半に、奇数が後半に集まります。

実装例

理解を深めるために、以下の Python 実装を見てみましょう。

class Solution(object):
    def sortArrayByParity(self, a):
        i = 0
        j = 0
        while j < len(a):
            if a[j] % 2 == 0:
                a[i], a[j] = a[j], a[i]
                i += 1
            j += 1
        return a

ob1 = Solution()
print(ob1.sortArrayByParity([1,5,6,8,7,2,3]))

入力

[1,5,6,8,7,2,3]

出力

[6,8,2,5,7,1,3]

計算量について

このアルゴリズムは配列を一度だけ走査するため、時間計算量は O(n)、追加のメモリを使用せず配列内で入れ替えを行うため、空間計算量は O(1) となります。

なお、出力結果では偶数同士・奇数同士の相対的な順序は元の配列と異なる場合があります。これはインプレースでのスワップを行っているためで、安定性が必要な場合は別途ソート処理を組み合わせる必要があります。

  1. Pythonで挿入ソート(Insertion Sort)を実装する方法:アルゴリズムとサンプルコードを徹底解説

    この記事では、Python 3.x(およびそれ以前のバージョン)における挿入ソートの実装方法について詳しく解説します。挿入ソートは、トランプの手札を整理するイメージに近い、直感的で理解しやすいソートアルゴリズムです。挿入ソートのアルゴリズム挿入ソートは以下の手順で動作します。入力要素を順番に走査し、各反復ごとにソート済みの配列部分を少しずつ拡張していきます。現在注目している要素(キー)を、ソート済み部分の中で最も大きい値と比較します。キーがその値より大きければ、要素は元の位置のまま次の要素へ進みます。そうでなければ、ソート済み配列内の正しい位置を探し出し、そこへ移動させます。具体的には、ソート

  2. Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法

    この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要