パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

Golangで挿入ソートの問題を解いてみた

前回同様、AOJの問題を解いてみます。 yuki-toida.hatenablog.com

挿入ソートの問題を解いてみた

問題

https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/1/ALDS1_1_A

自分が書いたコードはこちら

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

// 挿入ソート
func main() {
    sc := bufio.NewScanner(os.Stdin)
    sc.Split(bufio.ScanWords)
    n := nextInt(sc)
    ary := make([]int, n)
    for i := 0; i < n; i++ {
        ary[i] = nextInt(sc)
    }
    print(ary)
    insertionSort(ary, n)
}

func nextInt(sc *bufio.Scanner) int {
    sc.Scan()
    num, _ := strconv.Atoi(sc.Text())
    return num
}

func print(ary []int) {
    fmt.Printf("%v\n", strings.Trim(fmt.Sprint(ary), "[]"))
}

func insertionSort(ary []int, n int) {
    for i := 1; i < n; i++ {
        v := ary[i]
        j := i - 1
        for 0 <= j && v < ary[j] {
            ary[j+1] = ary[j]
            j--
        }
        ary[j+1] = v
        print(ary)
    }
}

AOJからのフィードバック

f:id:yuki-toida:20180911183414p:plain

難しくなってきたー。

挿入ソートは離れた要素を直接交換することなく、取り出した値vより大きい要素のみを後方に移動するので、安定ソートアルゴリズムです。

挿入ソートの計算量を考える

最悪の場合、各iループがi回発生するので(N2 - N) / 2 となるので、O(N2) となりそうです。

ただデータの並びが、昇順に並んでいると移動の必要が無くN回のみなので、O(N)で済みそうですね。