Go言語は、使っていると奥の深さを非常に感じます。
どの言語でもそうですが、慣れないうちは、基本の関数や書き方で面倒くさい書き方をするんですが、ググると便利に効率的に書いている人のソースコードに出会います。
これにより、自分にもその書き方が馴染むとそれがスキルアップに繋がるという習得方法です。
どの言語でも、裏技のような書き方があり、それを人に教わると「勉強になった」と思い、自分で見つけるとガッツポーズしたくなるぐらいうれしくなり、本やWEBで見つけると、「スキルアップした」と、どれも向上心を感じさせるいい行為なので、プログラマーのスキルアップってこうした喜びの繰り返しなのかと改めて感じさせられました。
ソース
package main
import "fmt"
func bucketSort(numbers []int) []int{
max := 0
for i := 0; i<len(numbers); i++ {
if max < numbers[i] {max = numbers[i]}
}
bucket := make([]int , max+1)
for i := 0; i<len(numbers); i++ {
bucket[numbers[i]] += 1
}
arr := []int{}
for i:=0; i<len(bucket); i++{
for j:=0; j<bucket[i]; j++{
arr = append(arr , i)
}
}
return arr
}
func main(){
numbers := []int{1,1,3,2,4,6,1,2,4,6}
nums := bucketSort(numbers)
fmt.Println(nums)
}
実行
$ go run bucketSort.go
[1 1 1 2 2 3 4 4 6 6]
解説
バケットソートの方式は、言語によって書き方が大きく変わってしまっています。
Go言語は、配列のkey判定がまだ自分のスキルで上手にできなかったので、他の言語では一括で行っていた処理を下記のようなフローに変更しています。
1. max値の取得
2. 同一数値の個数保持
3. ソートした後のデータ作成
本心としては他の言語と同じフローにしたかったな・・・
Golangの配列定義
# 空の配列を定義(数値)
arr := []int{}
> []
# 任意要素数の配列を定義
arr := make([]int , 10)
> [0,0,0,0,0,0,0,0,0,0]
arr := []int{0,0,0,0,0,0,0,0,0,0}
> [0,0,0,0,0,0,0,0,0,0]
arr := [10]int{}
> [0,0,0,0,0,0,0,0,0,0]
任意要素数の定義の3番目は、10という要素数を引数にするとエラーが出たので、1番目のmakeを使って定義しなければいけません。(変数で定義する場合)
配列に要素の追加
arr := []int{1,2,3,4,5}
# 後ろに追加
arr = append(arr , 6)
> [1,2,3,4,5,6]
# 初めに追加
arr = append(0 , arr)
> [0,1,2,3,4,5,6]
前後の要素追加は非常に簡単に行なえます。
とりあえず破壊的処理という事で便利に使えます。
関連リンク
wikipedia
たくさんのプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿