マージソート用の Python プログラム

公開: 2023-01-31

Python は、構造化されたオブジェクト指向の設計アプローチとシンプルで整理された構文と文法を備えたマルチパラダイム プログラミング言語として、さまざまな複雑さと規模のプロジェクトに取り組むプログラマーが選択する言語として急速に台頭しています。

Python は、事前に構築されたアルゴリズムのモジュラー ライブラリを提供します。これにより、ユーザーはさまざまな操作を実行できます。これにより、ユーザーは自分自身でタスクを達成したり、より大きく複雑な目標を達成するためのステップとして機能したりできます。 このようなアルゴリズムの中で最も一般的なものの 1 つは、マージ ソート機能を有効にするアルゴリズムです。

目次

マージソートとは?

これは、ユーザーが任意のタイプの任意のソースからランダムなデータセットを取得し、最終的に個々のコンポーネントに分解されるまで繰り返し段階に分割できるようにする汎用の並べ替え手法です。分割統治法。

次に、アルゴリズムは個々のコンポーネントをまとめますが、これも繰り返しの段階で行われますが、データ系列全体が目的の論理的順序で再構成されるまで、基本的な比較と交換を使用して、途中の各段階でそれらを事前に決定された論理的順序に並べ替えます。 .

upGrad で他のデータ サイエンス コースをチェックしてください。

分割統治法

たとえば、アルファベット文字のランダムなデータセットを考えてみましょう: N、H、V、B、Q、D、Z、R。

ステップ 1 :元のデータセットは、最初に次のように 2 つのグループに分割されます。

N、H、V、B Q、D、Z、R

ステップ 2 :結果として得られる両方の配列は、次のようにさらに分割されます。

N、H V、B Q、D Z、R

ステップ 3 :最後に、データ系列全体が個々のコンポーネントに分解されるまで、4 つの配列すべてがさらに吐き出されます。

N H V B Q D Z R

その後、プロセスが逆になり、個々のデータ ポイントが段階的にマージされ始めます。 ただし、このマージ プロセスの過程で、各サブ配列の各要素は、次のように論理的な順序 (アルファベット順) で並べ替えられるように評価および交換されます。

ステップ 4 :正しいシーケンスを形成するために必要に応じて位置を交換しながら、個々の要素がペアにマージされます。

H、N B、V D、Q R、Z

ステップ 5 :マージとソートの再帰プロセスは、次の繰り返しに続きます。

B、H、N、V D、Q、R、Z

ステップ 6 :データ系列全体が、論理的なアルファベット順で最終的に再構成されます。

B、D、H、N、Q、R、V、Z

人気のデータ サイエンス コースを探す

IIITBのデータサイエンスのエグゼクティブポスト大学院プログラム ビジネス上の意思決定のためのデータ サイエンスのプロフェッショナル認定プログラム アリゾナ大学でデータ サイエンスの理学修士号を取得
IIITB のデータ サイエンスの高度な証明書プログラム メリーランド大学のデータ サイエンスとビジネス分析のプロフェッショナル認定プログラム データサイエンスコース

マージソートの実装

Python でのマージ ソートの実装には 2 つのアプローチがあります。 トップダウンアプローチとボトムアップアプローチ。

トップダウンアプローチ:

より一般的に使用されるトップダウン アプローチは、上記のアプローチです。 時間がかかり、より多くのメモリを使用するため、小さなデータセットで作業する場合は非効率的です。 ただし、特に大規模なデータセットに適用する場合は、はるかに信頼性が高くなります。

人気のデータ サイエンス記事を読む

データ サイエンスのキャリア パス: 包括的なキャリア ガイド データ サイエンスのキャリア成長: 仕事の未来はここにあります データ サイエンスが重要な理由データ サイエンスがビジネスに価値をもたらす 8 つの方法
マネージャーにとってのデータサイエンスの関連性 すべてのデータ サイエンティストが持つべき究極のデータ サイエンス チート シート データ サイエンティストになるべき 6 つの理由
データ サイエンティストの 1 日: 彼らは何をしているのか? 神話の崩壊: データ サイエンスにコーディングは必要ない ビジネス インテリジェンスとデータ サイエンスの違い: 違いは何ですか?

入力コード:

def merge_sort (inp_arr):

サイズ = 長さ (inp_arr)

サイズ > 1 の場合:

中央 = サイズ // 2

left_arr = inp_arr(:middle)

rIght_arr = inp_arr(中:)

merge_sort(left_arr)

マージ _sort(right_arr)

私は= 0

j = 0

k = 0

(ここで、i と j はそれぞれデータ系列の左半分と右半分をトラバースする反復子であり、k はデータ系列全体の反復子です)。

left_size = len(left_arr)

右 _size = len(right_arr)

while i < left_size および j < right size:

left_arr(i) < right_arr (j) の場合:

inp_arr(k) – left_arr(i)

私 >= 1

そうしないと:

inp_arr(k) = right_arr (j)

j += 1

k += 1

while i < left_size:

inp_arr (k) = left_arr(i)

私は += 1

k += 1

j < right_size:

inp_arr (k) = right_arr(j)

j += 1

k += 1

inp_arr = (N、H、V、B、Q、D、Z、R)

print(:入力配列:\n”)

印刷 (inp_arr)

merge_sort (inp_arr)

print(“ソート済み配列:\n”)

印刷 (inp_arr)

出力:

入力配列: N、H、V、B、Q、D、Z、R

出力配列: B、D、H、N、Q、R、V、Z

ボトムアップアプローチ:

ボトムアップ アプローチは高速で、メモリの消費量が少なく、小さなデータセットで効率的に機能しますが、大きなデータ セットを操作するときに問題が発生する可能性があります。 したがって、使用頻度は低くなります。

入力コード:

デフマージ(左、右):

結果 = [] x、y = 0、0

k の範囲 (0, len(左) + len(右)) の場合:

if i == len(left): # if i == len(left): # if i == len(left): #前半終了時、

result.append(right[j]) # 後半のすべての値を追加

j += 1

elif j == len(right): # 後半終了の場合、

result.append(left[x]) # 前半のすべての値を追加

私は += 1

elif 右[j] < 左[i]:

result.append(右[j])

j += 1

そうしないと:

result.append(左[i])

私は += 1

結果を返す

デフマージソート(ar_list):

長さ = 長さ (ar_list)

サイズ = 1

サイズ < 長さ:

size+=size # 説明どおり 2 で初期化

範囲内の位置 (0、長さ、サイズ):

開始 = 位置

mid = pos + int(サイズ / 2)

終了 = 位置 + サイズ

左 = ar_list[開始: 中間] 右 = ar_list[ 中間: 終了]

ar_list[開始:終了] = マージ(左、右)

ar_list を返す

ar_list = [N、H、V、B、Q、D、Z、R] print(mergesort(ar_list))

出力:

入力配列: N、H、V、B、Q、D、Z、R

出力配列: B、D、H、N、Q、R、V、Z

より複雑な実際のデータセットに適用されるマージ ソートの実装

インドの 4 つのランダムなオフロード車にトップダウン アプローチを適用してみましょう。

ブランド

モデル

Rs Crore での元ショールーム価格

ジープラングラー0.58
フォード努力0.35
ジャガーランドローバーレンジローバー スポーツ2.42
メルセデスベンツGクラス1.76

入力コード:

クラス車:

def __init__(自己、ブランド、モデル、価格):

self.brand = ブランド

self.model = モデル

self.price = 価格

def __str__(自己):

return str.format("ブランド: {}, モデル: {}, 価格: {}", self.brand,

self.model、self.price)

def merge(list1, i, j, k, comp_fun):

left_copy = list1[i:k + 1]

r_sublist = list1[k+1:r+1]

left_copy_index = 0

j_sublist_index = 0

sorted_index = i

while left_copy_index < len(left_copy)およびj_sublist_index <

len(j_sublist):

if comp_fun(left_copy[left_copy_index], j_sublist[j_sublist_index]):

list1[sorted_index] = left_copy[left_copy_index]

left_copy_index = left_copy_index + 1

そうでなければ:

list1[sorted_index] = j_sublist[j_sublist_index]

j_sublist_index = j_sublist_index + 1

ソート済みインデックス = ソート済みインデックス + 1

while left_copy_index < len(left_copy):

list1[sorted_index] = left_copy[left_copy_index]

left_copy_index = left_copy_index + 1

ソート済みインデックス = ソート済みインデックス + 1

while j_sublist_index < len(j_sublist):

list1[sorted_index] = j_sublist[j_sublist_index]

j_sublist_index = j_sublist_index + 1

ソート済みインデックス = ソート済みインデックス + 1

def merge_sort(list1, i, j, comp_fun):

i >= j の場合:

戻る

k = (i + j)//2

merge_sort(list1, i, k, comp_fun)

merge_sort(list1, k + 1, j, comp_fun)

merge(list1,i,j,k,comp_fun)

car1 = Car(「ジープ」、「ラングラー」、0.58)

car2 = Car(“フォード”, “エンデバー”, 0.35)

car3 = Car(「ジャガー ランドローバー」、「レンジローバー スポーツ」、1.76)

car4 = Car(「メルセデス・ベンツ」、「Gクラス」、2.42)

list1 = [車1、車2、車3、車4]

merge_sort(list1, 0, len(list1) -1,ラムダcarA, carB: carA.brand < carB.brand)

印刷(「ブランドごとに並べ替えられた車:」)

list1場合:

プリント(車)

()を印刷

merge_sort(list1, 0, len(list1) -1, lambda carA, carB: carA.price< carB.price)

print (「価格順の車:」)

list1場合:

プリント(車)

出力:

ブランドごとに並べ替えられた車:

フォード・エンデバー

ジャガー ランドローバー レンジローバー スポーツ

ジープ・ラングラー

メルセデスベンツ Gクラス

価格で並べ替えられた車:

フォード・エンデバー

ジープ・ラングラー

ジャガー ランドローバー レンジローバー

メルセデスベンツ Gクラス

メリーランド大学のデータ サイエンスおよびビジネス分析に関する upGrad の Professional Certificate を使用して、Python の理論的側面と実践的側面の両方を学ぶことができます。 このコースは、Python をゼ​​ロから学習するのに役立ちます。 プログラミングやコーディングが初めての方でも、upGrad では 2 週間の準備コースを提供しており、プログラミングの基礎を学ぶことができます。 複数の業界プロジェクトに取り組みながら、Python、SQL などのさまざまなツールについて学習します。

この記事を共有したいですか?

今すぐソフトウェア開発キャリアを計画しましょう!

データサイエンスとビジネス分析のプロフェッショナル認定プログラムに申し込む