パパエンジニアのポエム

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

Golangでマージソートの問題を解いてみた

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

マージソートの問題を解いてみた

問題

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

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

package main

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

var cnt int

// マージソート
func main() {
    sc := bufio.NewScanner(os.Stdin)
    sc.Split(bufio.ScanWords)
    sc.Scan()
    n, _ := strconv.Atoi(sc.Text())
    A := make([]int, n)
    for i := 0; i < n; i++ {
        sc.Scan()
        A[i], _ = strconv.Atoi(sc.Text())
    }

    sorted := mergeSort(A)
    fmt.Println(strings.Trim(fmt.Sprint(sorted), "[]"))
    fmt.Println(cnt)
}

// Runs mergeSort algorithm on a slice single
func mergeSort(slice []int) []int {
    if len(slice) <= 1 {
        return slice
    }
    mid := len(slice) / 2
    left := mergeSort(slice[:mid])
    right := mergeSort(slice[mid:])
    return merge(left, right)
}

// Merges left and right slice into newly created slice
func merge(left, right []int) []int {
    size, k, j := len(left)+len(right), 0, 0
    tmp := make([]int, size)

    for i := 0; i < size; i++ {
        if len(left) <= j {
            tmp[i] = right[k]
            k++
        } else if len(right) <= k {
            tmp[i] = left[j]
            j++
        } else if right[k] < left[j] {
            tmp[i] = right[k]
            k++
        } else {
            tmp[i] = left[j]
            j++
        }
        cnt++
    }
    return tmp
}

AOJからのフィードバック

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

これで、まだまだ基本のアルゴリズムっていうのがなかなかハードだなーという印象。

ここまでの間にGolangの基本的な構文や実装方法は結構理解できてきたからもういいかなー。