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

なれない言語でコーディングするってことは、毎回新たな発見があるという事です。
これを苦しみと捉えるか、楽しみと捉えるかで、エンジニアの質が決まるのではないでしょうか?
多くの初心者の人がゴールに行くまでが苦痛で、ゴールした時に快感を得られると思っているようですが、
模索する途中をいかに楽しめるかが本質である事を今回のコーディングで改めて認識しました。
別に対して難しいプログラムでもないのに、慣れないコーディングってそれだけ思い通りに行かないって事。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
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) } |
実行
1 2 |
$ go run mergeSort.go [2 7 8 10 12 13 16] |
解説
GO言語のif文の書き方要注意!
以前もハマった内容ですが、改めて書いておきますが、if文におけるelseとelse ifは、他の言語のように柔軟な書き方ができません。
たとえば・・・
1 2 3 4 5 6 7 8 9 |
if(...){ ~~ } else if (..){ ~~ } else{ ~~ } |
このように書くとexpected errorになります。
エラーにならない書き方は以下
1 2 3 4 5 6 7 |
if(...){ ~~ }else if (..){ ~~ }else{ ~~ } |
配列操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 配列に追加 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} |
少数を整数に変換
1 2 3 |
func midPoint(nums []int) int { return int(float64 (len(nums) / 2) + 0.5) } |
return内部の少数計算の箇所はfloat64という型にして、それをintで変換しています。
C言語などで慣れている人は気にならないけど、インタプリタ系の言語しか触っていない人は、頑張って慣れましょう。
リンク
マージソート記事
解説
JavaScript
PHP
Python
Shell
AWK
C言語
Go言語