我只是在学习ruby而且KevinC的回复(in this link)对我有意义,只有一个例外。我不明白为什么代码包含在arr.each do | i |中#while ... end这部分对我来说似乎是多余的,而#39;而#39;循环已经击中每个位置?有人可以解释一下吗?
答案 0 :(得分:0)
内环找到一个气泡并将其抬起;如果它找到另一个较轻的气泡,它会将它们切换并携带较轻的气泡。所以你需要在数组中多次通过才能找到所有气泡并将它们带到正确的位置,因为你不能同时浮动几个气泡。
编辑:
each
在KevinC的代码中确实被误用了,因为它没有用于它的正常目的:产生集合的元素。而不是arr.each
,最好使用arr.size.times
- 因为它会为读者提供更多信息。在块内重新定义i
会增加对伤害的侮辱。虽然这些都不会导致代码错误,但这会产生误导。
代码的另一个问题是它没有提供提前终止条件(swapped
在该问题的大多数其他答案中)。理论上,冒泡排序可以在第一遍中找到排序的数组;其他size - 1
步骤是不必要的。 KevinC的代码仍然会干掉已经排序过的数组,从来没有意识到它已经完成了。
至于重写为无块代码,它当然是可能的,但你需要理解块语法在Ruby中非常惯用,而非块循环在Ruby世界中几乎闻所未闻。虽然Ruby有for
,但它在Ruby中几乎从未使用。但...
arr.each do |i|
...
end
相当于
for i in arr
...
end
再次,至少对于数组的情况,相当于
index = 0
while index < arr.size
i = arr[index]
...
index += 1
end