有没有一种方法可以在Ruby中使用while循环和any方法实现冒泡排序算法?

有没有一种方法可以在Ruby中使用while循环和any方法实现冒泡排序算法?,ruby,bubble-sort,enumerable,Ruby,Bubble Sort,Enumerable,我正在尝试使用一个带有任意枚举的while循环来优化冒泡排序算法,但在找到使其工作的方法时遇到了困难。现在,我得到了一个错误,但我想知道我是否在概念上正确的轨道上 我附上了一些示例,代码应该返回以获得更好的上下文 def bubble_sort(arr) while arr.any? { |ele, idx| ele > arr[idx + 1] } if arr[idx] > arr[idx + 1] arr[idx], arr[id

我正在尝试使用一个带有任意枚举的while循环来优化冒泡排序算法,但在找到使其工作的方法时遇到了困难。现在,我得到了一个错误,但我想知道我是否在概念上正确的轨道上

我附上了一些示例,代码应该返回以获得更好的上下文

def bubble_sort(arr)
    while arr.any? { |ele, idx| ele > arr[idx + 1] }
        if arr[idx] > arr[idx + 1]
            arr[idx], arr[idx + 1] = arr[idx + 1], arr[idx]
        end
    end
    return arr
end

p bubble_sort([2, 8, 5, 2, 6])      # => [2, 2, 5, 6, 8]
p bubble_sort([10, 8, 7, 1, 2, 3])  # => [1, 2, 3, 7, 8, 10]
如果您接受每次至少有一个未排序的对时对数组进行完全遍历,那么您可以使用
while!排序的
和定义的排序的本次运行是否为零掉期


如果您接受每次至少有一个未排序的对时对数组进行完全遍历,那么您可以使用
while!排序
并定义
sorted
作为本次运行的零交换吗?

如果
条件正确,但是
while循环
不正确我不熟悉
任何?
方法,该方法接受包含两个参数(显然是元素和索引)的块。请问,这是定义在哪个类中的?对冒泡排序进行“优化”毫无意义-对于大多数数据集来说,它是可用的最差优化算法。使用“any”将需要以某种方式对数组进行分区,这将使整个事情变得更糟。@MichaelChaney-如果没有其他原因,您应该实现它,以向自己证明冒泡排序不是最差的算法。:-)
if
条件是正确的,但是
while循环
不正确。我不熟悉
any?
方法,该方法接受包含两个参数(显然是元素和索引)的块。请问,这是定义在哪个类中的?对冒泡排序进行“优化”毫无意义-对于大多数数据集来说,它是可用的最差优化算法。使用“any”将需要以某种方式对数组进行分区,这将使整个事情变得更糟。@MichaelChaney-如果没有其他原因,您应该实现它,以向自己证明冒泡排序不是最差的算法。:-)哦,嵌套的do块,非常优雅,谢谢哦,嵌套的do块,非常优雅,谢谢
def bubble_sort(arr)
  sorted = false
  while !sorted
    did_a_swap = false
    arr.each_index do |idx|
      next unless arr[idx + 1]
      if arr[idx] > arr[idx + 1]
        did_a_swap = true
        arr[idx], arr[idx + 1] = arr[idx + 1], arr[idx]
      end
    end
    sorted = !did_a_swap
  end
  return arr
end

p bubble_sort([2, 8, 5, 2, 6])      # => [2, 2, 5, 6, 8]
p bubble_sort([10, 8, 7, 1, 2, 3])  # => [1, 2, 3, 7, 8, 10]
def bubble_sort(arr)
  length = arr.length

  (0..length-2).each do |i|
    (0..(length-i-2)).each do |j|
      if arr[j] > arr[j+1]
        arr[j+1], arr[j] = arr[j], arr[j+1]
      end
    end
  end

  arr
end