Pythonのマージソートアルゴリズムでスワップをカウントするにはどうすればよいですか?

user8671136

MergeSortアルゴリズムを実行しましたが、スワップをカウントする方法がわかりません。

私のコードは:

def mergesortInv(list):
    if len(list) < 2:
        return list
    else:
        middle = len(list) // 2
        left = mergesortInv(list[:middle])   #definim les dues meitats
        right = mergesortInv(list[middle:])
        swaps=???       
    return mergeInv(left, right,swaps)

def mergeInv(left, right,swaps):
    if len(left) < 1:
        return right
    if len(right) < 1:
        return left
    if left[0] <= right[0]:
        return [left[0]] + mergeInv(left[1:],right,swaps)
    else:
        return [right[0]] + mergeInv(left,right[1:],swaps)

このアルゴリズムの出力は、ソートされたリスト(アルゴリズムはこの部分で機能します)であり、スワップの数:mergesortInv(list) == ([1, 2, 3, 4, 5, 7, 8], 6)6はスワップの数です。

ポールパンツァー

動作しているように見えるコードのわずかに変更されたバージョンを次に示します。

def mergesortInv(list, mergeInv):
    if len(list) < 2:
        return list, 0
    else:
        middle = len(list) // 2
        left, lc = mergesortInv(list[:middle], mergeInv)   #definim les dues meitats
        right, rc = mergesortInv(list[middle:], mergeInv)
    merge, mc = mergeInv(left, right)
    return merge, lc + rc + mc

def mergeInvRec(left, right):
    if len(left) < 1:
        return right, 0
    if len(right) < 1:
        return left, 0
    if left[0] <= right[0]:
        res, cnt = mergeInvRec(left[1:], right)
        return [left[0]] + res, cnt
    else:
        res, cnt = mergeInvRec(left, right[1:])
        return [right[0]] + res, len(left) + cnt

def mergeInvFlat(left, right):
    res, cnt = [], 0
    il, ir = 0, 0
    nl, nr = len(left), len(right)
    while il < nl and ir < nr:
        if left[il] <= right[ir]:
            res.append(left[il])
            il += 1
        else:
            res.append(right[ir])
            ir += 1
            cnt += nl - il
    res.extend(left[il:])
    res.extend(right[ir:])
    return res, cnt

それは主に簿記の問題です。各ステップでのスワップの数を数え、それらを追加します。最後のブランチでは、rightバブルの最初の要素がすべての要素をはるかに超えleftているため、len(left)そこでスワップを集計します。

編集: @ PM2Ringが指摘しているように、の再帰mergeInvは少し無謀であり、適度なサイズのリストのPythonの最大再帰深度を超えます。非再帰バージョンを追加しました。main関数に2番目の引数として名前を渡すことにより、再帰バージョンと非再帰バージョンを切り替えることができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マージソートアルゴリズムの後に配列を再表示して、各ステップが表示されるようにするにはどうすればよいですか?

分類Dev

Rのtmパッケージでカスタムステミングアルゴリズムを使用するにはどうすればよいですか?

分類Dev

C ++で多くのステップアルゴリズムの「マネージャー」を作成するにはどうすればよいですか?

分類Dev

Electronアプリのウィンドウタイトルバーをカスタマイズするにはどうすればよいですか?

分類Dev

NaiveBayesアルゴリズムの使用中にワンホットエンコードを使用するにはどうすればよいですか?

分類Dev

マージソートアルゴリズムのスワップ/比較数をカウントする

分類Dev

Microsoftリモートデスクトップで、アカウントのパスワードを変更するにはどうすればよいですか?

分類Dev

パン、ズームイン、ズームアウトで完全なイメージマップを取得するにはどうすればよいですか?

分類Dev

このアルゴリズムでプリミティブ操作をカウントするにはどうすればよいですか?

分類Dev

エラーArrayIndexOutOfBoundsExceptionのない4ウェイパーティションでマージソートアルゴリズムを実装するにはどうすればよいですか?

分類Dev

マネージドソリューションのカスタムサイトマップエリア/グループ/サブエリアを追加するにはどうすればよいですか?

分類Dev

ローカルのGitオリジンとアップストリームの設定を更新するにはどうすればよいですか?

分類Dev

Javaで配列をソートするためのDrakeソートアルゴリズムを作成するにはどうすればよいですか?

分類Dev

Googleマップのズームイン/ズームアウトを指定された指定値に制限するにはどうすればよいですか?

分類Dev

マルチアカウントシステムを作成するにはどうすればよいですか?(ユーザー名、パスワードなど)

分類Dev

ループ内で拡張配列(それ自体がループされている)を使用してアルゴリズムの実行時間をカウントするにはどうすればよいですか?

分類Dev

マウスアップでカーソルを変更するにはどうすればよいですか?

分類Dev

このブルートフォースアルゴリズムで文字を段階的にチェックするにはどうすればよいですか?

分類Dev

CupertinoAppをローカリゼーションウィジェットでラップして、その中でマテリアルウィジェットを使用できるようにするにはどうすればよいですか?

分類Dev

Javaのクイックソートアルゴリズムで問題を修正するにはどうすればよいですか?

分類Dev

ifステートメントを使用してCで3整数の昇順アルゴリズムを作成するにはどうすればよいですか?

分類Dev

ローカルマシンへのアクセスを許可し、同じローカルネットワーク内の他のマシンとリソースへのアクセスを制限するにはどうすればよいですか?

分類Dev

これらの「if」ステートメントをアルゴリズムに変換するにはどうすればよいですか?

分類Dev

ウイルス/マイナーのUbuntuインストールをクリーンアップするにはどうすればよいですか?

分類Dev

プライマリ アカウントへのルート アクセスを取得するにはどうすればよいですか?

分類Dev

woocommerceの「マイアカウント」ページをカスタマイズするにはどうすればよいですか?

分類Dev

リソースの少ないデバイスでアルゴリズムのパフォーマンスをテストするにはどうすればよいですか?

分類Dev

Laravelでカスタムパスワードリセットリンク(プレフィックス付きのカスタマイズされたリンク)を送信するにはどうすればよいですか?

分類Dev

再帰的にリンクされたノード挿入ソートアルゴリズムを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    マージソートアルゴリズムの後に配列を再表示して、各ステップが表示されるようにするにはどうすればよいですか?

  2. 2

    Rのtmパッケージでカスタムステミングアルゴリズムを使用するにはどうすればよいですか?

  3. 3

    C ++で多くのステップアルゴリズムの「マネージャー」を作成するにはどうすればよいですか?

  4. 4

    Electronアプリのウィンドウタイトルバーをカスタマイズするにはどうすればよいですか?

  5. 5

    NaiveBayesアルゴリズムの使用中にワンホットエンコードを使用するにはどうすればよいですか?

  6. 6

    マージソートアルゴリズムのスワップ/比較数をカウントする

  7. 7

    Microsoftリモートデスクトップで、アカウントのパスワードを変更するにはどうすればよいですか?

  8. 8

    パン、ズームイン、ズームアウトで完全なイメージマップを取得するにはどうすればよいですか?

  9. 9

    このアルゴリズムでプリミティブ操作をカウントするにはどうすればよいですか?

  10. 10

    エラーArrayIndexOutOfBoundsExceptionのない4ウェイパーティションでマージソートアルゴリズムを実装するにはどうすればよいですか?

  11. 11

    マネージドソリューションのカスタムサイトマップエリア/グループ/サブエリアを追加するにはどうすればよいですか?

  12. 12

    ローカルのGitオリジンとアップストリームの設定を更新するにはどうすればよいですか?

  13. 13

    Javaで配列をソートするためのDrakeソートアルゴリズムを作成するにはどうすればよいですか?

  14. 14

    Googleマップのズームイン/ズームアウトを指定された指定値に制限するにはどうすればよいですか?

  15. 15

    マルチアカウントシステムを作成するにはどうすればよいですか?(ユーザー名、パスワードなど)

  16. 16

    ループ内で拡張配列(それ自体がループされている)を使用してアルゴリズムの実行時間をカウントするにはどうすればよいですか?

  17. 17

    マウスアップでカーソルを変更するにはどうすればよいですか?

  18. 18

    このブルートフォースアルゴリズムで文字を段階的にチェックするにはどうすればよいですか?

  19. 19

    CupertinoAppをローカリゼーションウィジェットでラップして、その中でマテリアルウィジェットを使用できるようにするにはどうすればよいですか?

  20. 20

    Javaのクイックソートアルゴリズムで問題を修正するにはどうすればよいですか?

  21. 21

    ifステートメントを使用してCで3整数の昇順アルゴリズムを作成するにはどうすればよいですか?

  22. 22

    ローカルマシンへのアクセスを許可し、同じローカルネットワーク内の他のマシンとリソースへのアクセスを制限するにはどうすればよいですか?

  23. 23

    これらの「if」ステートメントをアルゴリズムに変換するにはどうすればよいですか?

  24. 24

    ウイルス/マイナーのUbuntuインストールをクリーンアップするにはどうすればよいですか?

  25. 25

    プライマリ アカウントへのルート アクセスを取得するにはどうすればよいですか?

  26. 26

    woocommerceの「マイアカウント」ページをカスタマイズするにはどうすればよいですか?

  27. 27

    リソースの少ないデバイスでアルゴリズムのパフォーマンスをテストするにはどうすればよいですか?

  28. 28

    Laravelでカスタムパスワードリセットリンク(プレフィックス付きのカスタマイズされたリンク)を送信するにはどうすればよいですか?

  29. 29

    再帰的にリンクされたノード挿入ソートアルゴリズムを作成するにはどうすればよいですか?

ホットタグ

アーカイブ