Help us understand the problem. What is going on with this article?

Rubyでアルゴリズムを実装する:Day 2 -バブルソート-

正直やるか迷った2日目。
1日目はこちら<Rubyでアルゴリズムを実装する:Day 1 -ユークリッドの互除法-

今日はバブルソートを実装する

バブルソートとは

隣り合う数字を比較して条件に応じた交換を行うアルゴリズム
今回は数列の右側から比較して小さい順に並べるという実装を行う

bubbleSort.rb

コード

# バブルソート

def bubbleSort(num)
  len = num.length                           # 数列の長さを格納
  len.times do |i|                           # 数列の長さ分ループ
    (len - 1).downto(i+1) do |j|             # 数列の長さ-1~i+1までループ
      if num[j]  < num[j-1]                  # 数列の一番奥とその一つ手前を比べる。
        num[j], num[j-1] = num[j-1], num[j]  # 奥の数の方が小さければ入れ替えを行う
      end
    end
    puts "#{i+1}回目;#{num.join(" ")}"       # 出力
  end
end

puts "数字を入力"
number = gets.split().map(&:to_i)             # 入力した数字をint型で配列に格納
bubbleSort(number)                            # 実行                                               

実行

数字を入力
5 9 3 1 2 8 4 7 6
1回目;1 5 9 3 2 4 8 6 7
2回目;1 2 5 9 3 4 6 8 7
3回目;1 2 3 5 9 4 6 7 8
4回目;1 2 3 4 5 9 6 7 8
5回目;1 2 3 4 5 6 9 7 8
6回目;1 2 3 4 5 6 7 9 8
7回目;1 2 3 4 5 6 7 8 9
8回目;1 2 3 4 5 6 7 8 9
9回目;1 2 3 4 5 6 7 8 9

多分これで合っている、、、はず。
今回は配列の奥から。要は後に入れた数字から順番にソートをした。
そのため、いつもどおりtimesで繰り返すのではなく、downtoを使ってみた。

downtoメソッド

downto(min) {|n| ... } -> self
self から min まで 1 ずつ減らしながらブロックを繰り返し実行します。 self < min であれば何もしません。。
[参照:Ruby 2.7.0 リファレンスマニュアル]

最後に

条件を変えることでいろいろな実装ができそうで、書いていて楽しかった。
配列の要素の入れ替えもRubyならでは?なのかなって感じがしたけどほかの言語わかんないから比べようがなかった

同じ条件で実行早くしたり、コードの簡略化ができそうな気もするので、有識者のみなさん知恵を貸してください。

明日は二分探索を実装します。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away