質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

1回答

2536閲覧

ruby にてマージソートのアルゴリズムを書いています。よくわからないエラーが出ます

shocyu

総合スコア17

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2015/10/07 09:15

ruby にてアルゴリズムのライブラリを製作すべくいろいろプログラムを書いています。

出来る限り書いてはみたのですが、結果が思うように出なかったり、エラーが出たりしています。

ソースは以下になりますが、真ん中の while 文の箇所( x[k] = buffer[i] や x[k] = x[j] 配列に値を代入する箇所にて) "[]= " : no implici conversion from nil to integer とエラーが出ます。

対策を教えてください。

(ソース)

ruby

1# Sort モジュール(クイックソートとマージソートの処理で構成) 2module Sort 3 4#merge_sort メソッド(マージソート) 5#引数 (n, x) = (配列の要素の数、ソートする配列) 6def self.merge_sort(n, x) 7 8 i, j, k, m = 0 9 10 if n <= 1 11 return 12 end 13 14 m = n / 2 15 16 buffer = x[m..(n - 1)] 17 18 # ブロックを前半と後半に分けてソート(再帰呼び出し) 19 merge_sort(m, x) 20 merge_sort(n - m, buffer) 21 22 # x の前半を x の後半にコピー 23 x[(n - m)..(n - 1)] = x[0..(m - 1)] 24 25 j = n - m 26 27 # buffer(ブロックの後半をソートした配列)とxの後半とで比較して、小さい方をxの前半に入れる 28 while i < m && j < n do 29 if buffer[i] <= x[j] 30 x[k] = buffer[i] 31 k += 1 32 i += 1 33 else 34 x[k] = x[j] 35 k += 1 36 j += 1 37 end 38 end 39 40 #while i < m do 41 # x[k + t] = buffer [i] 42 # k += 1 43 # i += 1 44 #end 45 46 #p x 47 48end 49# merge_sort メソッド終わり 50 51end 52#Sort モジュール終わり 53 54#配列を生成し、ソートする(main 処理) 55 56#配列の大きさを入力 57puts "Number of index" 58a = gets.to_i 59N = a 60 61# 要素数Nの配列を生成 62sort_array = Array.new(N) 63 64puts "Before sort" 65# 1000以下の乱数を生成し、sort_array配列に格納 66for i in 0..(N - 1) do 67 68 sort_array[i] = Random.rand(1000) 69 print sort_array[i].to_s + ", " 70end 71 72puts "\n" 73 74puts "Sort is started" 75# quick_sort メソッド呼び出し 76Sort.merge_sort(N, sort_array) 77 78puts "Sort ended" 79for i in 0..(N - 1) do 80 print sort_array[i].to_s + ", " 81end 82 83puts "\n"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すみません、rubyは詳しくないですが、違和感あるところを書きます

no implici conversion from nil to integer
nilは整数に変換できません

ということなので、何か初期化されていない変数を使ってると思いました

調べたところ

i, j, k, m = 0

これだと i=0, j=nil, k=nil, m=nil となるのではないでしょうか?

k だけは値を代入するタイミングが無いことから、そのまま [k] と使うと問題のエラーが出ることで状況が一致しそうです

複数の変数をいっぺんに初期化するなら

i, j, k, m = 0, 0, 0, 0

というように、変数の数分必要みたいです

いかがでしょうか

投稿2015/10/07 09:53

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shocyu

2015/10/07 10:00

ご回答ありがとうございます。変数の初期化をやり直してみたところ、エラーがなくなりました。 しかしながら、どうも詰めが甘いみたいです。どのような並びに関してもうまくいくように思えません。これは別の質問で対応させていただきます。 エラーの意味が分かってまた一つ勉強になりました。ありがとうございました。
otn

2015/10/07 12:29

普通は、i=j=k=m=0 でしょうね。 ただ、「使う変数はとにかく0を入れとけ」みたいな初期化は良くないですね。 初期値として0を入れる必要のある物だけに0を入れましょう。
takito

2015/10/07 13:32

ruaの慣習みたいなのがあるのかと思ったのですが、otnさんの書き方が素直ですね おつしゃるとおり、0もそれ自体が意味ある数値なので、必要な時に必要な値をもって初期化すべきと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問