【问题标题】:Where is the bug in my bubble sort code?我的冒泡排序代码中的错误在哪里?
【发布时间】:2014-07-12 21:11:24
【问题描述】:

我看到有更好的 ruby​​ 冒泡排序代码已经发布在诸如这里的地方: Using the Bubble sort method for an array in Ruby 但是我在调​​试我当前的代码时遇到了麻烦,希望能帮助我弄清楚我的代码为什么不起作用。谢谢。

def bubble_sort(arr)
    original = arr
    x = 0
    while x < arr.count - 1
        if arr[x] < arr[x + 1]
            y = arr[x + 1]
            arr[x + 1] = arr[x]
            arr[x] = y
        end
        x += 1
    end
    if original == arr
        return arr
    else
        return bubble_sort(arr)
    end 
end

【问题讨论】:

  • 定义“不起作用”
  • original = arr 不会像您认为的那样做。你也在修改original。试试... = arr.dup
  • 虽然冒泡排序不是很有效,但这是我能想象到的最糟糕的变体。
  • @undur_gongor:这意味着OP有很大的潜力:)

标签: ruby bubble-sort


【解决方案1】:

四个问题:

  1. bubble_sort[arr] 不起作用 - 您应该致电 bubble_sort(arr)
  2. original == arr - 总是正确的,因为你之前将它分配给 arr - 你应该使用 dup - original = arr.dup 分配它
  3. arr[x] &lt; arr [x+1] 将创建一个以相反顺序排序的数组...
  4. 您应该更改本地副本而不是作为参数获得的副本 - result = arr.dup 而不是 original = arr.dup

以上修复后的代码:

def bubble_sort(arr)
  result = arr.dup
  x = 0
  while x < result.count - 1
    if result[x] > result[x + 1]
      y = result[x + 1]
      result[x + 1] = result[x]
      result[x] = y
    end
    x += 1
  end
  if arr == result
    return result
  else
    return bubble_sort(result)
  end 
end

bubble_sort([1,3,5,2,4])
# => [1, 2, 3, 4, 5]

【讨论】:

  • 使用 result.count.times do |x| 而不是 while ... 可能会稍微干净一些?这样您就不需要手动初始化或增加索引。
  • 有十种不同的方法可以让这段代码更干净——我的目标是让它工作。成功后,我建议 OP 将其交给codereview.stackexchange.com 进行认真审查。
【解决方案2】:

其中一个问题是:

original = arr

您希望original 拥有当前状态下的arr 的副本,对吧?嗯,不。它们将指向同一个数组。这就是为什么你的函数永远不会在这里递归:

if original == arr
    return arr
else
    return bubble_sort[arr]
end 

要复制数组,请使用dup

original = arr.dup

【讨论】:

    猜你喜欢
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多