logo

Python での挿入ソート

挿入ソートは、以前のバブル ソート アルゴリズムよりも簡単で効率的なアルゴリズムです。挿入ソート アルゴリズムの概念は、特定のカードに従ってトランプをソートするカードのデッキに基づいています。これには多くの利点がありますが、データ構造で使用できる効率的なアルゴリズムが多数あります。

カードをプレイしている間、私たちはカードの手札を互いに比較します。ほとんどのプレイヤーはカードを昇順に並べ替えて、自由に使える組み合わせをすぐに確認することを好みます。

挿入ソートの実装は、通常、プログラミングの最初のレッスンで教えられるため、簡単かつシンプルです。それは 所定の位置に そして 安定したアルゴリズム これは、ほぼソートされた要素、または少数の要素の場合により有益です。

挿入ソート アルゴリズムは要素のソートにネストされたループを使用するため、それほど高速ではありません。

次の用語を理解しましょう。

インプレースと安定とはどういう意味ですか?

    所定の位置に:インプレース アルゴリズムでは、コレクションの入力サイズを気にせずに追加のスペースが必要になります。並べ替えを実行した後、コレクション内の要素の元のメモリ位置が書き換えられます。安定した:安定とは、初期配列からの等しいオブジェクトの相対的な順序を管理する用語です。

さらに重要なことは、挿入ソートでは配列サイズを事前に知る必要がなく、一度に 1 つの要素を受け取ることです。

挿入ソートの優れた点は、ソート対象の要素をさらに多く挿入すると、完全なソートを実行せずにアルゴリズムが適切な場所に配置することです。

サイズが小さい (10 未満) 配列の場合は、より効率的です。ここで、挿入ソートの概念を理解しましょう。

挿入ソートの概念

配列は挿入ソートの 2 つの部分に仮想的にこぼれました - An 未分類の部分 そして 並べ替えられた 一部。

ソートされた部分には配列の最初の要素が含まれ、ソートされていない他の部分には配列の残りの部分が含まれます。ソートされていない配列の最初の要素は、ソートされた配列と比較され、適切なサブ配列に配置されます。

右側の値が左側より小さい場合にすべての要素を移動して要素を挿入することに重点を置いています。

すべての要素が正しい場所に挿入されるまで、この問題が繰り返し発生します。

挿入ソートを使用して配列を並べ替えるには、次のような挿入ソートのアルゴリズムを使用します。

  • リストをソート済みとソートなしの 2 つの部分に分けました。
  • 指定された配列に対して arr[1] から arr[n] までを繰り返します。
  • 現在の要素を次の要素と比較します。
  • 現在の要素が次の要素より小さい場合は、前の要素と比較して、1 つ上の位置の大きい要素に移動して、交換された要素用のスペースを作ります。

次の例を理解してみましょう。

検討させていただきます 最初の要素 の中に ソートされた配列 次の配列にあります。

[10、4、25、1、5]

への最初のステップ 10を追加します ソートされた部分配列へ

ブラウン管モニター

[ 10 、4、25、1、5]

ここで、ソートされていない配列から最初の要素を取得します - 4. この値を新しい変数に保存します 温度今 、10>4 であることがわかり、10 を右に移動すると、以前に保存されていた 4 が上書きされます。

[ 10 、10、25、1、5] (温度 = 4)

ここで、4 はソートされた部分配列内のすべての要素より小さいため、最初のインデックス位置に挿入します。

[ 4、10、 25、1、5]

ソートされた部分配列には 2 つの要素があります。

次に、数値 25 を確認します。これを一時ファイルに保存しました。 変数。 25> 10 かつ 25> 4 の場合、それを 3 番目の位置に置き、ソートされた部分配列に追加します。

[ 4、10、25、 15]

もう一度数値 1 を確認します。それを次の場所に保存します。 温度 1 は 25 より小さいです。25 を上書きします。

[ 4、10、25、 25, 5] 10>1 の場合は再度上書きされます

[ 4、25、10、 25、5]

[ 25、4、10、 25, 5] 4>1 今度は temp の値を 1 に設定します。

[ 1、4、10、25 、5]

これで、ソートされた部分配列に 4 つの要素ができました。 5<25 25 then shift to the right side and pass 左側にtemp = 5。

[ 1、4、10、25 、25] 温度 = 5 を設定します

ここで、一時値を入力するだけでソートされた配列を取得します。

[1、4、5、10、25]

指定された配列がソートされます。

実装

挿入の実装は比較的簡単です。 Python の整数配列を使用して実装します。次の例を理解してみましょう -

Python プログラム

文字列ビルダーJava
 # creating a function for insertion def insertion_sort(list1): # Outer loop to traverse through 1 to len(list1) for i in range(1, len(list1)): value = list1[i] # Move elements of list1[0..i-1], that are # greater than value, to one position ahead # of their current position j = i - 1 while j &gt;= 0 and value <list1[j]: list1[j + 1]="list1[j]" j -="1" return list1 # driver code to test above 5, 13, 8, 2] print('the unsorted list is:', list1) sorted insertion_sort(list1)) < pre> <p> <strong>Output:</strong> </p> <pre> The unsorted list is: [10, 5, 13, 8, 2] The sorted list1 is: [2, 5, 8, 10, 13] </pre> <p> <strong>Explanation:</strong> </p> <p>In the above code, we have created a function called <strong>insertion_sort(list1).</strong> Inside the function -</p> <ul> <li>We defined for loop for traverse the list from 1 to <strong>len(list1).</strong> </li> <li>In for loop, assigned a values of list1 in <strong>value</strong> Every time the loop will iterate the new value will assign to the value variable.</li> <li>Next, we moved the elements of list1[0&#x2026;i-1], that are greater than the <strong>value,</strong> to one position ahead of their current position.</li> <li>Now, we used the while to check whether the j is greater or equal than 0, and the <strong>value</strong> is smaller than the first element of the list.</li> <li>If both conditions are true then move the first element to the 0<sup>th</sup> index and reduce the value of j and so on.</li> <li>After that, we called the function and passed the list and printed the result.</li> </ul> <h2>Sorting Custom Objects</h2> <p>Python provides the flexibility to change the algorithm using a custom object. We will create a custom class and redefine the actual comparison parameter and try to keep the same code as the above.</p> <p>We would require to overload the operators in order to sort the objects in a different way. But, we can pass another argument to the <strong>insertion_sort()</strong> function by using the <strong>lambda</strong> function. The lambda function is a convenient when calling the sorting method.</p> <p>Let&apos;s understand the following example of sorting custom objects.</p> <p>First, we are defining the <strong>Point</strong> class:</p> <h3>Python Program</h3> <pre> # Creating Point class class Point: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return str.format(&apos;({},{})&apos;, self.a, self.b) def insertion_sort(list1, compare_function): for i in range(1, len(list1)): Value = list1[i] Position = i while Position &gt; 0 and compare_function(list1[Position - 1], Value): list1[Position] = list1[Position - 1] Position = Position - 1 list1[Position] = Value U = Point(2,3) V = Point(4,4) X = Point(3,1) Y = Point(8,0) Z = Point(5,2) list1 = [U,V,X,Y,Z] # We sort by the x coordinate, ascending insertion_sort(list1, lambda x, y: x.a &gt; y.a) for point in list1: print(point) </pre> <p> <strong>Output:</strong> </p> <pre> The points are in the sorted order (2,3) (3,1) (4,4) (5,2) (8,0) </pre> <p>Using the above code, we can sort the coordinate points. It will work for any type of the list.</p> <h2>Time Complexity in Insertion Sort</h2> <p>Insertion sort is a slow algorithm; sometimes, it seems too slow for extensive dataset. However, it is efficient for small lists or array.</p> <p>The time complexity of the insertion sort is - <strong>O(n<sup>2</sup>).</strong> It uses the two loops for iteration.</p> <p>Another important advantage of the insertion sort is that; it is used by the popular sorting algorithm called <strong>Shell sort.</strong> </p> <p>The auxiliary space in insertion sort: <strong>O(1)</strong> </p> <h2>Conclusion</h2> <p>Insertion sort is a simple and inefficient algorithm that has many advantages, but there are more efficient algorithms are available.</p> <p>In this tutorial, we have discussed the concept of the insertion sort and its implementation using the Python programming language.</p> <hr></list1[j]:>

説明:

上記のコードでは、という関数を作成しました。 挿入ソート(リスト1)。 関数内 -

  • リストを 1 から 1 まで走査するための for ループを定義しました。 len(リスト1)。
  • for ループで、list1 の値を割り当てます。 価値 ループが反復されるたびに、新しい値が value 変数に割り当てられます。
  • 次に、list1[0…i-1] の要素より大きい要素を移動しました。 価値、 現在の位置より 1 つ前の位置に移動します。
  • ここで、while を使用して j が 0 以上であるかどうかを確認し、 価値 リストの最初の要素よりも小さいです。
  • 両方の条件が true の場合、最初の要素を 0 に移動します。番目インデックスを作成し、j の値を減らすなどです。
  • その後、関数を呼び出してリストを渡し、結果を出力しました。

カスタムオブジェクトの並べ替え

Python には、カスタム オブジェクトを使用してアルゴリズムを変更する柔軟性が備わっています。カスタム クラスを作成し、実際の比較パラメータを再定義して、上記と同じコードを維持しようとします。

オブジェクトを別の方法で並べ替えるには、演算子をオーバーロードする必要があります。ただし、別の引数を渡すことができます。 挿入ソート() を使用した関数 ラムダ 関数。ソートメソッドを呼び出す場合にはラムダ関数が便利です。

カスタム オブジェクトを並べ替える次の例を理解してみましょう。

まず、以下を定義しています。 ポイント クラス:

Python プログラム

 # Creating Point class class Point: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return str.format(&apos;({},{})&apos;, self.a, self.b) def insertion_sort(list1, compare_function): for i in range(1, len(list1)): Value = list1[i] Position = i while Position &gt; 0 and compare_function(list1[Position - 1], Value): list1[Position] = list1[Position - 1] Position = Position - 1 list1[Position] = Value U = Point(2,3) V = Point(4,4) X = Point(3,1) Y = Point(8,0) Z = Point(5,2) list1 = [U,V,X,Y,Z] # We sort by the x coordinate, ascending insertion_sort(list1, lambda x, y: x.a &gt; y.a) for point in list1: print(point) 

出力:

 The points are in the sorted order (2,3) (3,1) (4,4) (5,2) (8,0) 

上記のコードを使用すると、座標点を並べ替えることができます。どのタイプのリストでも機能します。

挿入ソートの時間計算量

挿入ソートは遅いアルゴリズムです。場合によっては、大規模なデータセットに対しては遅すぎると思われる場合があります。ただし、小さなリストや配列の場合は効率的です。

挿入ソートの時間計算量は - の上2)。 反復に 2 つのループを使用します。

挿入ソートのもう 1 つの重要な利点は次のとおりです。これは、と呼ばれる一般的な並べ替えアルゴリズムによって使用されます。 シェルソート。

挿入ソートの補助スペース: ○(1)

結論

挿入ソートは単純で非効率なアルゴリズムですが、多くの利点がありますが、より効率的なアルゴリズムも利用できます。

このチュートリアルでは、挿入ソートの概念と、Python プログラミング言語を使用したその実装について説明しました。