読者です 読者をやめる 読者になる 読者になる

【Go】Goでクイックソートを書いた

Goでクイックソートを書いてみました。
クイックソートとは、複数あるソートアルゴリズムの中でも最速といわれるものとなります。

実行例:

go run quicksort.go 8 5 9 0 1 4 7 2 3 6 

実行結果:

[0 1 2 3 4 5 6 7 8 9]

main関数では、flagパッケージを使いコマンドライン引数から値を取得します。
さらに、strconv.Atoiで文字列を数値に変換した上で、q_sort関数にソート対象のSliceを渡します。


肝となるq_sort(クイックソート関数)ですが、解説は他のサイトで詳しくされているのでそちらをご参照のこと。

と思っていくつか見ていたら、基準値とする場所の違いがあるようですね。
上記ソースは先頭パターンです。

真ん中パターン:クイックソート - Wikipedia
先頭パターン:クイックソート
最後パターン:ソートと探索(クイックソート)



こちらの書籍を参考に書きました。
とても丁寧でアルゴリズム初学者でもじっくり理解できます。

アルゴリズムを、はじめよう

アルゴリズムを、はじめよう

SIer企業に入社し言語の知識を学んで仕事をしてきましたが、改めてアルゴリズムを学ぶともっと合理的な書き方ができそうだなぁと、プログラミングすることが楽しみになってきそうです。

【Go】実行ファイルのディレクトリパスを取得する

相対パスで読み込みたい外部ファイルなどを指定していると、いざビルドして実行する際に

The system cannot find the file specified.

などと言われます。
これは、ユーザーが実行ファイルを実行している階層からの相対パスを参照してしまうため、実行ファイルが存在する階層以外から実行すると指定のファイルがない、ということになってしまうためです。

どこから実行しても、実行ファイルからの相対パスを参照したい場合には、以下のようにします。

参考:
go - Golang: How to Get the Directory of the Currently running File? - Stack Overflow

これで、実行ファイルの絶対パスが取得されます。
ここから、外部ファイル先へのパスを追記するなどして、ご利用ください。

(しかし出典元と全く同じだな(汗

【Go】外部ファイルを読み込んでsliceにする

お疲れ様です。

タイトルのとおりですが、「改行区切り」と「csv(カンマ区切り)」のパターンで見ていきます。

改行区切りでslice


gist90703dca517b274f2d6b53a11947a0f6
参考:
go - Read text file into string array (and write) - Stack Overflow

bufio.NewScanner は、改行文字で区切られたバイト列を1つずつ読み込みます。
scanner.Scan() は、次のデータブロック(つまり次の行)のデータを読み込み、データが見つかったかどうかの真偽値を返します。そのため、for文の判定として利用できます。
データが見つかったら、文字列のsliceにappendして、最終的にそのsliceを返しています。

カンマ区切りでslice


gist8ee0307edd81d90d19a48500bc5256e1
参考:
Golang csv Examples: NewReader and ReadAll

改行区切りの時と考え方は同じです。
読み込みが終わった場合は err == io.EOF でfor文を抜けます。

これで勉強中です:

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発