[アルゴリズム] 挿入ソートの実装(Go言語編)

2017年2月1日

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

今更ながらGo言語に少しミスが起きやすい箇所を見つけました。 それは、他の言語との記述について、明らかな違いによって、コーディング中に何度も似たようなミスをした事で実感しました。 1つ目は、変数の定義と代入の際の「hoge := **」という書き方で「:(コロン)」のつけ忘れを都度やってしまう点。 2つ目は、関数の定義で「func hoge(arr []int , num int) []int{...}」という風に、型を重視して記述する点。 3つ目は、C言語でも同じですが、一度定義した変数をその後使わずに放置するとその場でエラーになってしまうという点です。 これらは、Golang特有なものもあるし、プログラム言語としては許せるレベルでもあるんですが、とにかくこの辺のミスをしないように慣れるところから始めないといけないという事か・・・ そんなわけで「挿入ソート」のGo編を書きます。

ソースコード

package main import "fmt" func insertSort(numbers []int) []int { // 数値配列を最初から順番に評価していく for i := 1; i<len(numbers); i++{ //fmt.Println(i ,"=" ,numbers[i]); // 確定数値リストを取得 confirmLists := getConfirmLists(numbers , i); // fmt.Println("1 : " , confirmLists); // 対象外の数値リストを取得 lastLists := getLastLists(numbers , i); // fmt.Println("2 : " ,lastLists); // 確定数値リストに対象数値が挿入される位置を取得する replaceNum := getInsertPlace(confirmLists , numbers[i]); // fmt.Println("-" , replaceNum); // 確定数値リストに挿入数値の挿入 firstLists := setInsert(confirmLists , numbers[i] , replaceNum); // fmt.Println("3 : " ,firstLists); // リストの結合 numbers = setUnionLists(firstLists , lastLists); } return numbers; } func getConfirmLists(numbers []int , targetNum int) []int{ num := []int{}; for i := 0; i<len(numbers); i++ { if(i == targetNum){break;} num = append(num , numbers[i]); } return num; } func getLastLists(numbers []int, targetNum int) []int{ num := []int{}; for i := targetNum+1; i < len(numbers); i++ { num = append(num , numbers[i]); } return num; } func getInsertPlace(confirmLists []int, targetNum int) int{ num := len(confirmLists); for i:=0; i<len(confirmLists); i++{ if(targetNum < confirmLists[i]){ num = i; break; } } return num; } func setInsert(confirmLists []int , targetNum int , replaceNum int) []int{ // 挿入操作 num := []int{}; for i:=0; i<len(confirmLists); i++{ if(i == replaceNum){num = append(num , targetNum)} num = append(num , confirmLists[i]); } // 挿入番号がnullの場合は入れ替えなし if(replaceNum == len(confirmLists)){ num = append(num , targetNum); } return num; } func setUnionLists(firstLists []int, lastLists []int) []int{ num := []int{}; if(len(firstLists) >0){ for i:=0; i<len(firstLists); i++{ num = append(num , firstLists[i]); } } if(len(lastLists) >0){ for i:=0; i<len(lastLists); i++{ num = append(num , lastLists[i]); } } return num; } func main(){ numbers := []int{10,2,12,7,16,8,13} num2 := insertSort(numbers); fmt.Println(num2); }

実行

$ go run insertSort.go [2 7 8 10 12 13 16] プログラム内に配列を定義しているので、汎用性が薄いプログラムなので、ARGV取り込みによりソートできるようにしなければいけませんね。 または、別のファイルを読み込んでやるとか・・・

解説

空の配列定義

num := []int{}; あまり問題なく定義できたので、そんなに問題ではありませんね。

配列の追加処理

num = append(num , ***); これも他言語で言うところのpushと同じなのでさほど問題ないんですが、appendされたデータを同じ配列に入れるのを忘れるとエラーになるので、PHPやJSとは少し扱いが違うので要注意!!

文字列連結

fmt.Println関数で表示する内容で文字列や数値などを連結して表示したい場合は、「,(カンマ)」区切りでつなげていくとそのまま表示されます。

関数

Go言語の関数は下記の構文で定義できます。 func 関数名(受取値1 型 , 受取値2 型...) 戻り値の型 { 処理 } 受取値は、1つでもいいんですが、カンマ区切りでいくつでも受け渡しできます。 戻り値は無ければ、型の記述は不要です。

関連リンク

いろいろなプログラム言語でアルゴリズム学習

このブログを検索

ごあいさつ

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