LoginSignup
0
0

More than 1 year has passed since last update.

本日のRuby基礎練習問題(22/4/5)

Posted at

問題

以下の要件を満たすbubble_sortメソッドを実装しましょう。
要素が数値である配列を受け取り、数値の小さい順に並べ替えること
小さい順に並べ替えた結果を出力すること
↓雛形

ruby.rb
def bubble_sort(data)
  # 配列の数を数える処理を記述
  length = 

  # for文を2つ使用する
  # 先頭から隣の数同士の大きさを比べる
  # 先頭側の要素の方が大きい場合は、配列の位置を隣同士で交換する
end

# 呼び出し例
number = [1,23,4,6,12,45,79]
bubble_sort(number)
puts number

出力例
1
4
6
12
23
45
79

ヒント
・for文を使う
・for文の入れ子を使う
・「隣同士の大きさを比較し、もし先頭側の文字の方が大きい場合は位置を交換する」という処理をする
・配列内の要素の入れ替えを行う
方法:array[a], array[b] = array[b], array[a]

私の回答

ruby.rb
def bubble_sort(data)
  length = data.length 
  for a in 0..6
   for b in 1..

  # 時間制限のため回答できず!!!
end

# 呼び出し例
number = [1,23,4,6,12,45,79]
bubble_sort(number)
puts number

模範回答

ruby.rb
def bubble_sort(data)
  length = data.length 
  for i in 0..(length-1) 
    for j in 1.. (length-i-1) 
      if data[j-1] > data[j] 
        data[j-1],data[j] = data[j],data[j-1] 
      end
    end
  end
end

number =  [1,23,4,6,12,45,79]

bubble_sort(number)

puts number

模範解説

まずは、コード全体の流れを簡単に説明します。
1〜10行目でbubble_sortメソッドを定義しています。ここでは仮引数をdataとしています。
12行目で要素の数が7個の配列numberを定義しています。
14行目でnumberを本引数として、bubble_sortメソッド呼び出しています。
16行目では、bubble_sortメソッドを実行した結果、要素の順番が変わった配列numberの値を出力しています。

次に、1〜10行目で定義したbubble_sortメソッドの中身を詳しく解説します。
2行目で、配列dataの要素の数をカウントし、その結果を変数lengthに代入しています。今回は7です。

3行目の親のfor文では、配列dataの要素の数だけ処理が繰り返されるように設定しています。
変数iには、配列の要素の位置番号が順に代入されます。配列の要素は先頭を0番目とカウントするので「length(配列の要素の数)-1」となっていることに注意です。

4行目の子のfor文では、親のfor文の処理回数に関連して、処理が繰り返されるように設定しています。

親のfor文が1回目の時は、変数jに1から6までの数字が順に代入されていきます。(length-i-1)が、7(配列の数)-0(変数i)-1 = 6となるからです。
親のfor文が2回目の時は、変数jに1から5までの数字が順に代入されていきます。(length-i-1)が、7(配列の数)-1(変数i)-1 = 5となるからです。

繰り返し処理の内容について説明します。
5行目では、配列の先頭から順に隣同士の数の大きさを比較しています。if文は「隣同士の数を比べて、前の数の方が大きければ」という条件になっています。
6行目では、if文の条件に当てはまった場合のみ、配列の位置を交換しています。

これらの処理を配列内のすべての数を比較し終えるまで繰り返すと、配列内の数を小さい順に並べ替えることができます。

感じたこと

for文の理解が浅すぎて知識不足が目立った。
でもRubyではeach文があるので、そこまで重要性は高くなさそう。
他言語では使用すると思うので復習はしていく。

またfor文の変数名がiやjに指定されていることに疑問を持ったため調べたら。
インデックス(Index)の「i」でした。
世界最初の高級言語であるFORTRANに由来しており、数学チックな考えからi,j,kなどがよく使われるとのこと。
特に決まりはないと思うが、理由がない限りループカウンタではi,j,kあたりを使用していきたい。

アドバイスやご指摘等ございまいたらぜひお願いします!!

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0