何度かGo言語でソートアルゴリズム作ってきましたが、今回は初めてelse if文を使った事と、while文がgo言語に無いこと知り、少し戸惑ってしまいました。
C言語のようにポインタ使って処理しようかと思ったんですが、あまり冒険せずにそのままストレートなソースで書いてます。
ソース
package main
import "fmt"
func mid(x int , y int , z int) int {
if x < y {
if y < z {
return y
} else if z < x {
return x
} else {
return z
}
} else {
if z < y {
return y
} else if x < z {
return x
} else {
return z
}
}
}
func quickSort(numbers []int , begin int , end int) []int {
// 左辺と右辺の開始位置を定義
var left int = begin
var right int = end
// ピボット(中央の値)
mid_num := int (left + ((right - left)/2))
var pivot int = mid(numbers[left] , numbers[mid_num] , numbers[right])
// ソート処理実行(pivotが交差するまで続行)
for {
// 左辺のpivotよりも大きい値見つける
for numbers[left] < pivot {left++}
// 右辺のpivotよりも小さい値をみつける
for numbers[right] > pivot {right--}
//pivotが交差したら終了
if(left >= right){break}
// 値の入れ替え処理
var tmp int = numbers[left]
numbers[left] = numbers[right]
numbers[right] = tmp
// 繰り返し対応
left++
right--
}
// pivotの左辺のソート処理
if begin < left {numbers = quickSort(numbers , begin , left-1)}
// pivotの右辺のソート処理
if right < end {numbers = quickSort(numbers , right+1 , end)}
return numbers
}
func main(){
numbers := []int{10,2,12,7,16,8,13}
num2 := quickSort(numbers , 0 , len(numbers)-1)
fmt.Println(num2)
}
実行
$ go run quickSort.go
[2 7 8 10 12 13 16]
※エラー出まくりましたが、多くがsyntaxエラーだったので、成功結果のみ載せてます・・・
解説
whileが無い・・・
Go言語にはwhile文が無いですが、その分for文が強力な機能を持っています。
ていうか、他の言語より、Go言語のfor文が使いやすいんですけど、これいいですね。
ちなみに、Go言語のwhileの代わりのfor文は、条件無しでfor{...}と書くだけで、任意の段階でbreakすればいいので、無限loopバグがあれば地獄ですが、それでもプログラム言語としては、理解しやすいと思います。
else ifの書き方
何度もsyntaxになったのがif文の書き方で、他の言語では、{}の改行などあまりシビアに気にしなくていいのに、Go言語では下記のように書かないとイケないようです。
if y < z {
return y
}
else if z < x {
return x
}
else {
return z
}
$ go run quickSort.go
# command-line-arguments
./quickSort.go:10: syntax error: unexpected else, expecting }
./quickSort.go:13: syntax error: unexpected else, expecting }
if y < z {
return y
} else if z < x {
return x
} else {
return z
}
個人的に、上記の書き方をしてきたので、この形固定というのは非常に心苦しい・・・が、我慢するとしよう。
変数宣言
書き方が複数あり、とても悩ましい仕様の一つである変数の宣言だが、少し気になるポイントを書いておく。
// 整数の宣言 1
var hoge int
hoge = 100
// 整数の宣言 2
var hoge int = 100
//整数の宣言 3
hoge := int(100)
2番が書きやすいかな〜
なんでこんなに種類があるのか不明ですが、慣れるしかないですね。
関連記事
アルゴリズム学習
0 件のコメント:
コメントを投稿