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

Pythonで配列が「ほぼソート済み」かどうかを判定する方法

ほぼソートされた配列とは?

すべての要素がユニーク(重複なし)である数値の配列 nums があるとします。この配列が「ほぼソートされている(almost sorted)」かどうかを判定する必要があります。

ここでいう「ほぼソートされている」とは、各要素がソート後の本来の位置から最大1つ分だけずれた位置に存在している状態を指します。言い換えれば、どの要素も正しい位置から1インデックス以内の距離にあれば、その配列はほぼソートされているとみなせます。

入力が nums = [10, 30, 20, 40] の場合、出力は True になります。なぜなら、10 は本来の位置にあり、その他の要素(30 と 20)もそれぞれ本来の位置から最大1つ分しかずれていないためです。

解決アプローチ

この問題は、以下の手順で解決できます。

  1. インデックス i := 0 から開始する
  2. i が配列の長さ - 1 未満である間、以下を繰り返す:
    • nums[i] > nums[i + 1] の場合、2つの要素を入れ替え、i を1つ余分に進める
    • i を1増やす
  3. 再度配列全体を走査し、隣接する要素に降順のペア(nums[i] > nums[i + 1])が残っていれば False を返す
  4. 問題がなければ True を返す

このアルゴリズムのポイントは、順序が崩れている箇所を見つけたら一度だけスワップして修正し、その後もう一度全体をチェックすることです。すべての要素が本来の位置から最大1つずれている場合のみ、この単純な修正で完全にソートされた状態になります。

実装例

以下のコードで実際の動作を確認してみましょう。

def solve(nums):
    i = 0
    while i < len(nums) - 1:
        if nums[i] > nums[i + 1]:
            nums[i], nums[i + 1] = nums[i + 1], nums[i]
            i += 1
        i += 1
    for i in range(len(nums) - 1):
        if nums[i] > nums[i + 1]:
            return False
    return True

nums = [10, 30, 20, 40]
print(solve(nums))

入力

[10, 30, 20, 40]

出力

True

まとめ

この方法では、まず隣接する逆順のペアを1回のスワップで修正し、その後に全体を再検証することで、配列がほぼソートされているかどうかを効率的に判定できます。時間計算量は O(n) 程度であり、要素数が多い配列でも高速に処理できるのが特徴です。

  1. 【Python入門】配列を指定位置まで反転させる2つの方法を解説

    はじめにこのチュートリアルでは、Pythonで配列の先頭から指定された位置までの要素を反転させる方法を解説します。まずは、どのような処理を行うのか具体的に確認しておきましょう。問題の定義整数の配列と数値 n が与えられたとき、0番目のインデックスから (n-1)番目のインデックスまでの要素を反転させることが目的です。例えば、次のようになります。入力array = [1, 2, 3, 4, 5, 6, 7, 8, 9]、n = 5出力[5, 4, 3, 2, 1, 6, 7, 8, 9]この処理を実現するための基本的な手順は以下の通りです。配列と数値 n を初期化するn ÷ 2 回だけループ処理

  2. 指定した位置まで配列を反転するPythonプログラムの書き方

    ユーザーから入力された配列と、反転したい位置が与えられたとき、その位置までの部分配列を逆順に並べ替えるのが本記事の目的です。具体的には、配列の先頭から n 番目までの要素(インデックス 0 ~ n-1)を反転し、残りの要素は元の順序のまま後ろに連結します。実行例入力:A=[3, 7, 6, 4, 1, 2] n=4 出力:[1, 4, 6, 7, 3, 2]この例では、先頭から 4 番目までの要素 [3, 7, 6, 4] が [4, 6, 7, 3] と反転され、残りの [1, 2] がそのまま後ろに続いています。アルゴリズムステップ1:先頭から n-1 番目までの要素を逆順に並べ替える ス