[アルゴリズム] マージソートのプログラミング(Go言語編)

2017年3月26日

Go テクノロジー プログラミング 特集

なれない言語でコーディングするってことは、毎回新たな発見があるという事です。 これを苦しみと捉えるか、楽しみと捉えるかで、エンジニアの質が決まるのではないでしょうか? 多くの初心者の人がゴールに行くまでが苦痛で、ゴールした時に快感を得られると思っているようですが、模索する途中をいかに楽しめるかが本質である事を今回のコーディングで改めて認識しました。 別に対して難しいプログラムでもないのに、慣れないコーディングってそれだけ思い通りに行かないって事。

ソースコード

package main import "fmt" func midPoint(nums []int) int { return int(float64 (len(nums) / 2) + 0.5) } func setMerge(arr1 []int , arr2 []int) []int { arr := []int{} for len(arr1) > 0 || len(arr2) > 0 { if len(arr1) == 0 { arr = append(arr , arr2[0]) arr2 = arr2[1:] } else if len(arr2) == 0 { arr = append(arr , arr1[0]) arr1 = arr1[1:] } else if arr1[0] > arr2[0] { arr = append(arr , arr2[0]) arr2 = arr2[1:] } else{ arr = append(arr , arr1[0]) arr1 = arr1[1:] } } return arr } func mergeSort(numbers []int) []int { if len(numbers) == 0 { numbers = nil } else if len(numbers) == 1 { numbers = numbers } else if len(numbers) == 2 { if numbers[0] > numbers[1] { var tmp int = numbers[0] numbers[0] = numbers[1] numbers[1] = tmp } } else{ var midNum int = midPoint(numbers) arr1 := []int{} arr2 := []int{} arr1 = numbers[0:midNum] arr2 = numbers[midNum:] arr1 = mergeSort(arr1) arr2 = mergeSort(arr2) numbers = setMerge(arr1 , arr2) } return numbers } func main(){ numbers := []int{10 , 2 , 12 , 7 , 16 , 8 , 13} nums := mergeSort(numbers) fmt.Println(nums) }

実行

$ go run mergeSort.go [2 7 8 10 12 13 16]

解説

GO言語のif文の書き方要注意!

以前もハマった内容ですが、改めて書いておきますが、if文におけるelseとelse ifは、他の言語のように柔軟な書き方ができません。 たとえば・・・ if(...){ ~~ } else if (..){ ~~ } else{ ~~ } このように書くとexpected errorになります。 エラーにならない書き方は以下 if(...){ ~~ }else if (..){ ~~ }else{ ~~ }

配列操作

# 配列に追加 arr := []int{} arr = append(arr , 1) arr = append(arr , 2) > {1 , 2} # slice arr := []int{1,2,3,4,5} arr = arr[1:2] > {1 , 2} arr = arr[3:] > {4 , 5} arr = arr[:3] > {1 , 2 , 3}

少数を整数に変換

func midPoint(nums []int) int { return int(float64 (len(nums) / 2) + 0.5) } return内部の少数計算の箇所はfloat64という型にして、それをintで変換しています。 C言語などで慣れている人は気にならないけど、インタプリタ系の言語しか触っていない人は、頑張って慣れましょう。

関連記事

たくさんのプログラム言語でアルゴリズム学習

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。