递归冒泡红宝石

时间:2015-10-15 20:33:20

标签: ruby sorting recursion

我正在尝试在Ruby中构建一个递归冒泡排序方法。它通过一次通过很好,但它在那之后继续返回。看来我的 if array == swapped_array正在被触发,但我不明白我的array变量在哪里被重新定义。

def bubble_sort(array, swapped = true)
  return array if swapped == false
  i = 0
  if swapped == true
    swapped_array = comparator(array)
  end
  if array == swapped_array
    swapped = false
    bubble_sort(array, swapped)
  else bubble_sort(swapped_array)
  end
end

def comparator(array, i = 0)
  return array if i == array.length - 1
  if array[i] > array[i+1]
    array[i], array[i+1] = array[i+1], array[i]
  end
  i += 1
  comparator(array, i)
end

2 个答案:

答案 0 :(得分:2)

swapped_array = comparator(array)

...获取comparator的返回值并将其分配给swapped_array。但是comparator(最终)返回原始参数array,它与调用者中定义的array相同。array == swapped_array 。所以

.dup

总是如此。

如果要比较两个不同的数组,可以在数组上调用{{1}}。这将创建一个与原始对象具有相同值的新对象。

答案 1 :(得分:0)

这是因为在comparator中,您正在交换原始数组中的元素。无论你做什么,array中的swapped_arraybubble_sort都指向相同的数组实例,因此它们将始终相同。要解决此问题,请在定义的顶部添加一行:

def comparator(array, i = 0)
  array = array.dup
  ...
end