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

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

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

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

Q&A

解決済

1回答

1600閲覧

バブルソートに関して bubblingメソッドに処理を理解したい

cheeeeeeese

総合スコア179

Ruby

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

1グッド

1クリップ

投稿2015/10/15 18:54

編集2015/10/15 18:55

###状況
githubのGist?でバブルソートに関するコードを探していたら下記のコードを見つけ理解しようとしたところ、
bubblingメソッドでつまづきました。

###前提・実現したいこと

バブルソートの処理を行うメソッド bubblingメソッドの処理を理解できないためご質問致します。お手すきの時によろしくお願い申し上げます。

###理解したいコード

def bubbling (length - 1).times do |i| self[i], self[i+1] = self[i+1], self[i] if self[i] < self[i+1] end delete_at(-1) end p [3, 1, 5, 6, 10, 9].bubble_sort
疑問1 timesメソッドの繰り返しを行いたいオブジェクトに記述されているlengthは何を示すのか?? =>これは[3, 1, 5, 6, 10, 9]の長さを表していると仮定しています。 疑問2 self[i], self[i+1] = self[i+1], self[i] if self[i] < self[i+1]のコード部分は全く理解できていないため、 詳しく解説していただければと思います。 疑問3 delete_at(-1)のコードは何を減算しているのかが理解できていません。

###全てのソースコードと理解しているところまでの記述

class Array def bubble_sort ary = self.dup res = [] res.push ary.bubbling until ary.empty? return res end def bubbling (length - 1).times do |i| self[i], self[i+1] = self[i+1], self[i] if self[i] < self[i+1] end delete_at(-1) end end p [3, 1, 5, 6, 10, 9].bubble_sort 解説 アルゴリズム/バブルソートの学習 ソートのアルゴリズムの一つで隣接交換法とも言われる。 隣り合う要素の大小を比較しながら整列させること bubble_sortメソッド 1 Arrayクラスを生成する 2 bubble_sortメソッドを呼び出す 3 bubblingメソッドを呼び出す 4 ローカル変数tmpにself(Array).dupを代入 => self(Array)レシーバのコピーした値を返しているため、配列オブジェクトとなる。 5 ローカル変数resに空の配列オブジェクトを生成し代入。例 values = [] # 空の配列を作成 6 resオブジェクトにpushメソッドを呼び出す。配列の最後に要素を追加する aryオブジェクトにbubblingメソッドを呼び出す。そしてaryオブジェクトの配列が空になるまでbubblingメソッドを繰り返し処理する。 emptyメソッド 文字列が空文字列ならtrue 空でなければfalseを返す untilメソッド 条件式がfalseの場合、繰り返し処理をする。 7 bubble_sortメソッドの戻り値にresオブジェクトを指定する。
DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

疑問1
timesメソッドの繰り返しを行いたいオブジェクトに記述されているlengthは何を示すのか??

=>これは[3, 1, 5, 6, 10, 9]の長さを表していると仮定しています。

仮定の通り、[3, 1, 5, 6, 10, 9]の長さです。

疑問2
self[i], self[i+1] = self[i+1], self[i] if self[i] < self[i+1]のコード部分は全く理解できていないため、
詳しく解説していただければと思います。

selfはここでは[3, 1, 5, 6, 10, 9]の事です。
self[i] が self[i+1] より小さい場合、
self[i] と self[i+1] を交換するという処理になります。

疑問3
delete_at(-1)のコードは何を減算しているのかが理解できていません。

self( [3, 1, 5, 6, 10, 9] )の一番後ろの要素をselfから取り出して( selfからは削除 )して、bubblingの戻り値にしている。


オープンクラスという機能を学ぶと設問1と設問3は解決すると思います。

ruby

1class Array 2 def bubble_sort 34 end 5 def bubbling 67 end 8end

これはArrayクラス( [3, 1, 5, 6, 10, 9] など配列 )の機能を拡張する行為です。

参考
[Ruby] メタプログラミングの入り口、オープンクラスを理解する - Qiita
delete_at (Array) - Rubyリファレンス
多重代入 - 変数 - Ruby入門
制御構造 (Ruby 1.9.3) ( 「if 修飾子」 の辺り )

投稿2015/10/15 22:13

編集2015/10/15 22:14
MIURA_Yasuyuki

総合スコア306

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

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

cheeeeeeese

2015/10/16 08:50

ありがとうございます!!
cheeeeeeese

2015/10/16 11:48

また参考以下のリンクで理解を深めたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問