首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冒泡排序法

冒泡排序法
EN

Stack Overflow用户
提问于 2015-01-08 12:55:10
回答 1查看 193关注 0票数 0

我正在学习ruby和KevinC的response (in this link)对我来说很有意义,但有一个例外。我不明白为什么代码包含在arr.each do |i| #中...结束这部分对我来说似乎是多余的,因为'while‘循环已经命中了每个位置?有人能解释一下吗?

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 13:08:12

内部循环找到一个气泡并将其带上;如果它找到另一个较轻的气泡,它会切换它们并携带较轻的气泡。因此,您需要多次遍历数组才能找到所有气泡并将它们带到正确的位置,因为您不能同时浮动多个气泡。

编辑:

each在KevinC的代码中确实被误用了,因为它并没有用于其正常用途:生成集合的元素。使用arr.size.times会比使用arr.each更好--因为它会给读者提供更多的信息。在代码块中重新定义i是雪上加霜。虽然所有这些都不会导致代码本身出错,但它具有误导性。

代码的另一个问题是它没有提供提前终止条件(在该问题的大多数其他答案中为swapped)。理论上,冒泡排序可以在第一次遍历中找到排序的数组;其他的size - 1步骤是不必要的。KevinC的代码仍然会干驼峰已经排序的数组,永远不会意识到它已经完成了。

至于重写成无块代码,这当然是可能的,但你需要理解的是,块语法在Ruby中是非常惯用的,而非块循环在Ruby世界中几乎是闻所未闻的。虽然Ruby有for,但它几乎从未在Ruby中使用过。但是..。

代码语言:javascript
复制
arr.each do |i|
  ...
end

等同于

代码语言:javascript
复制
for i in arr
  ...
end

同样,至少对于数组情况而言,它等同于

代码语言:javascript
复制
index = 0
while index < arr.size
  i = arr[index]
  ...
  index += 1
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27833209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档