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からのフィードバック
難しくなってきたー。
挿入ソートは離れた要素を直接交換することなく、取り出した値vより大きい要素のみを後方に移動するので、安定ソートアルゴリズムです。
挿入ソートの計算量を考える
最悪の場合、各iループがi回発生するので(N2 - N) / 2 となるので、O(N2) となりそうです。
ただデータの並びが、昇順に並んでいると移動の必要が無くN回のみなので、O(N)で済みそうですね。