以下のコードは私の初心者のバブルソート方法です。どのようにブロックを「バブルソート」メソッドに渡すことができますか?
#For each element in the list, look at that element and the element
#directly to it's right. Swap these two elements so they are in
#ascending order.
def bubble_sort (array)
a = 0
b = 1
until (array.each_cons(2).all? { |a, b| (a <=> b) <= 0}) == true do
sort = lambda {array[a] <=> array[b]}
sort_call = sort.call
loop do
case sort_call
when -1 #don't swap
a += 1
b += 1
break
when 0 #don't swap
a += 1
b += 1
break
when 1 #swap
array.insert(a,array.delete_at(b))
a += 1
b += 1
break
else #end of array, return to start
a = 0
b = 1
break
end
end
end
puts array.inspect
end
array = [4, 2, 5, 6, 3, 23, 5546, 234, 234, 6]
bubble_sort(array)
このメソッドを変更して、コードブロックを引数として受け取り、そのソート方法を判断することができます。例えば
: array = ["hello", "my", "name", "is", "daniel"] bubble_sort(array) {array[@a].length <=> array[@b].length}
(私はこれを試してみたとき、私は、コード全体でインスタンス変数にa
とb
になってきました。)
私はyield
を使用して試してみましたが、私はundefined method 'length' for nil:NilClass
一度に取得します配列の終わりに達する。私は、このような
if array[@b+1] == nil
@a = 0
@b = 1
end
これは役立ちますが、私はまだ無限ループまたは要素の一定量以上を並べ替えることができないような奇妙な問題で終わるようなものに追加しようとしました。
短いストーリーですが、私はこれまで数時間でした。私がやりたいことをする簡単な方法はありますか?ありがとう。
これはすばらしく、はるかにクリーナーです。ありがとうございます。私が抱えている唯一の問題は、別の議論を通していることです。すなわち、方法自体を変更することなく、単語を長さでソートする。だから、 '' bubble_sort(["This"、 "is"、 "my"、 "array"]){| a、b | a.length <=> b.length)} '毎回メソッドを変更したり変更したりすることなく、ここでそれを行うことができますか?私は毎回行く必要があり、毎回「ソート?」を変更する必要があるように感じる。何とかそこにブロックをつけることはできますか?私はここに投稿する前に何か似たようなことをしようとしていましたが、 '<= 0'も必要なので、' yield 'を働かせることができませんでした。 –
はい、よりクリーンで信頼性の高いソリューションで私の編集を参照してください –