ソートアルゴリズム---挿入ソート(Javaバージョン)

直接挿入ソート

原理

挿入ソートの原則は、配列内のデータを、ソートされた間隔とソートされていない間隔の2つの間隔に分割することです。最初のソートされた間隔には、配列の最初の要素である要素が1つだけあります。挿入アルゴリズムの中心的なアイデアは、並べ替えられていない間隔の要素を取得し、並べ替えられた間隔で適切な挿入位置を見つけて挿入し、並べ替えられた間隔のデータが常に正しいことを確認することです。ソートされていない間隔の要素が空になり、アルゴリズムが終了するまで、このプロセスを繰り返します。

アルゴリズムのプロセスを次の図に示します。
ここに画像の説明を挿入

アルゴリズムは次のように説明されます。

  • 最初の要素から始めて、要素はソートされたと見なすことができます。
  • 次の要素を取り出し、並べ替えられた要素のシーケンスで後ろから前にスキャンします。
  • 要素(ソート済み)が新しい要素よりも大きい場合は、要素を次の位置に移動します。
  • ソートされた要素が新しい要素以下になる位置が見つかるまで、手順3を繰り返します。
  • 新しい要素をこの位置に挿入した後。
  • 手順2〜5を繰り返します。

コード

public class InsertSort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    101, 34, 98, 1};
        int insertVal = 0;
        int insertIndex = 0;
        for (int i = 1; i < arr.length; i++) {
    
    
            //取出未排序的下一个元素,及当前参与比较的元素
            insertVal = arr[i];
            //在已经排序的元素序列中从后向前扫描,定义前置索引
            insertIndex = i - 1;

            //insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
            //需要将 arr[insertIndex] 后移 即 插入的元素一直和它前面的值进行比较,直到找到正确的位置,之后将该位置的值进行插入
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    
    
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            //正确的位置不交换元素
            if (insertIndex + 1 !=i) {
    
    
                arr[insertIndex + 1] = insertVal;
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}

1:挿入ソートの時間計算量はどれくらいですか?

並べ替えるデータが既に整理されている場合は、データを移動する必要はありません。順序付けされたデータグループの挿入位置を最後から最初まで検索する場合、挿入位置を決定するために一度に1つのデータを比較するだけで済みます。したがって、この場合、最適な時間計算量はO(n)です。ここでは、順序付けられたデータを最後から最初までトラバースすることに注意してください。配列が逆の順序である場合、各挿入は配列の最初の位置に新しいデータを挿入することと同等であるため、大量のデータを移動する必要があるため、最悪の場合の時間計算量はO(n ^ 2)です。配列にデータを挿入する平均時間計算量はO(n ^ 2)です。したがって、挿入ソートの場合、各挿入操作は、配列にデータを挿入し、ループでn回の挿入操作を実行することと同じです。したがって、平均時間計算量はO(n ^ 2)です。

2:挿入ソートのスペースの複雑さは何ですか?

実装プロセスから、挿入ソートアルゴリズムを実行するために追加のストレージスペースを必要としないことは明らかです。したがって、スペースの複雑さはO(1)です。つまり、これはインプレースソートアルゴリズムです。

3:挿入ソートは安定したソートアルゴリズムですか?

挿入ソートでは、同じ値の要素について、前に表示された要素の後に後に表示される要素を挿入することを選択できます。これにより、元の順序を変更せずに維持できるため、挿入ソートは安定したソートアルゴリズムです。

おすすめ

転載: blog.csdn.net/qq_33626996/article/details/113178437