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

【Python】偶数・奇数ごとに配列を並べ替えるパリティソートの実装方法

整数がいくつか格納された配列 A があるとしましょう。この配列を、偶数が先頭側、奇数が後ろ側に来るように並べ替えることを考えます。たとえば、配列が A = [1, 5, 6, 8, 7, 2, 3] であれば、実行結果は [6, 8, 2, 1, 5, 7, 3] のようになります。

アルゴリズムの考え方

この問題は、2つのインデックス(ポインタ)を使った「その場での入れ替え(インプレーススワップ)」によって効率的に解くことができます。手順は次のとおりです。

  • i = 0、j = 0 で初期化します。

  • j が配列の長さより小さい間、以下を繰り返します。

    • arr[j] が偶数であれば、arr[i] と arr[j] を入れ替え、i を 1 増やします。

    • その後、j を 1 増やします。

  • ループが終わったら arr を返します。

ポイントは、変数 i が常に「次に偶数を配置すべき位置」を指し続けることです。偶数を見つけるたびに先頭側へ送り出すため、走査が完了した時点で配列の前半には偶数、後半には奇数が集まります。

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()
nums = [1, 5, 6, 8, 7, 2, 3]
print(ob1.sortArrayByParity(nums))

入力

[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. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要