データ構造とアルゴリズム(Golang実装)(21)ソートアルゴリズム挿入ソート

ソートを挿入

挿入ソート。通常、単純挿入ソートまたは直接挿入ソートを指します。つまり、すでに配置されたシーケンスに番号が挿入されて新しいシーケンスシーケンスが形成されるたびに、以下同様に続きます。

挿入ソートは挿入ソートアルゴリズムに属しています。

私を除いて、一部の人々は最初のカードと比較して2番目のカードからポーカーをプレイすることに慣れています。2番目のカードが最初のカードよりも小さい場合、最初のカードの前に挿入され、最初の2つのカードは両方になります。順序はソートされ、3番目のカードから始まり、ソートされた順序で最初の2つのカードに挿入されて3つのソートされたカードが形成され、後ろの4番目のカードが前のソートされた順序に挿入されます。リスト内の3つのカードがソートされます。

1.アルゴリズムの紹介

簡単な例として、4つの要素のシーケンスを挿入します4 2 9 1::

[]表示排好序

第一轮: [4] 2 9 1 拿待排序的第二个数 2,插入到排好序的数列 [4]
    与排好序的数列 [4] 比较
    第一轮进行中:2 比 4 小,插入到 4 前
第二轮: [2 4] 9 1 拿待排序的第三个数 9,插入到排好序的数列 [2 4]
    与排好序的数列 [2 4] 比较
    第二轮进行中: 9 比 4 大,不变化
第三轮: [2 4 9] 1 拿待排序的第四个数 1,插入到排好序的数列 [2 4 9]
    与排好序的数列 [2 4 9] 比较
    第三轮进行中: 1 比 9 小,插入到 9 前
    第三轮进行中: 1 比 4 小,插入到 4 前
    第三轮进行中: 1 比 2 小,插入到 2 前
结果: [1 2 4 9]

最良のケースでは、並べ替えられた数値のシーケンスを挿入し、反復N-1ラウンドが必要です。各ラウンドの最初の比較では、並べ替えられる数がその左側の数より大きいため、このラウンドは終了します。 、比較する必要はありません、交換する必要はありません、この時間の複雑さは、次のとおりですO(n)

最悪の場合、比較の各ラウンドで、ソートされる数値は左の順序のすべての数値よりも小さいため、交換する必要があります。N-1最初のラウンドを1回比較して交換する必要があり、2番目のラウンドを2回比較して交換する必要があります。第4ラウンドに三から三、4は、この数は次のとおりです。1 + 2 + 3 + 4 + ... + N-1時間の複雑さとバブルソート、選択ソート、以下のとおりですO(n^2)

右から左なので、ソートされていない数値は左側のソートされたキューに挿入されます。したがって、ソートを挿入すると、同じ番号の順序はソート後に変更されません。このソートアルゴリズムは安定しています。

2.アルゴリズムの実装

package main

import "fmt"

func InsertSort(list []int) {
    n := len(list)
    // 进行 N-1 轮迭代
    for i := 1; i <= n-1; i++ {
        deal := list[i] // 待排序的数
        j := i - 1      // 待排序的数左边的第一个数的位置

        // 如果第一次比较,比左边的已排好序的第一个数小,那么进入处理
        if deal < list[j] {
            // 一直往左边找,比待排序大的数都往后挪,腾空位给待排序插入
            for ; j >= 0 && deal < list[j]; j-- {
                list[j+1] = list[j] // 某数后移,给待排序留空位
            }
            list[j+1] = deal // 结束了,待排序的数插入空位
        }
    }
}

func main() {
    list := []int{5}
    InsertSort(list)
    fmt.Println(list)

    list1 := []int{5, 9}
    InsertSort(list1)
    fmt.Println(list1)

    list2 := []int{5, 9, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3}
    InsertSort(list2)
    fmt.Println(list2)
}

出力:

[5]
[5 9]
[1 3 4 5 6 6 6 8 9 14 25 49]

配列サイズがn小さいほとんどの場合、挿入ソートを使用できます。これは、バブルソートおよび選択ソートよりも高速で、他のソートアルゴリズムよりも高速です。

シーケンスの順序が高いほど、挿入ソートのパフォーマンスが高くなります。これは、ソートされる配列の順序が高いほど、挿入ソート比較の数が少なくなるためです。

バブリング、直接選択、直接挿入のソートアルゴリズムは、要素の数が多い順序付けられていない数値では非常に非効率であるため、誰もめったに使用しません。

シリーズ記事エントリー

私は、スター陳思い、私が個人的に書かれているようこそ(Golangが達成)のデータ構造とアルゴリズムの記事で始まる、より親しみやすいGitBookを読むために

おすすめ

転載: www.cnblogs.com/nima/p/12724855.html