有没有办法在 Ruby 中使用带有任何方法的 while 循环来执行冒泡排序算法?

Posted

技术标签:

【中文标题】有没有办法在 Ruby 中使用带有任何方法的 while 循环来执行冒泡排序算法?【英文标题】:Is there a way to do Bubble Sort algorithm in Ruby using a while loop with an any method? 【发布时间】:2020-04-20 18:37:32 【问题描述】:

我正在尝试使用带有任何可枚举对象的 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]

【问题讨论】:

if 条件正确,但while loop 不正确 我不熟悉any? 方法,它接受一个带有两个参数(显然是元素和索引)的块。请问这是在哪个类中定义的? “优化”冒泡排序没有任何意义——对于大多数数据集来说,它是可用的最优化算法。使用“any”需要以某种方式对数组进行分区,这会使整个事情变得更糟。 @MichaelChaney - 你应该实现BogoSort,如果没有其他理由向自己证明冒泡排序不是最不优化的算法。 :-) 【参考方案1】:
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]

如果您接受每次至少有一对未排序的对时都对数组进行完整传递,那么您可以使用 while !sorted 并将 sorted 定义为 这次运行是否有零交换 em>?

【讨论】:

冒泡排序被称为冒泡排序,因为在每次传递中,最高的未排序值“冒泡”到其正确位置。除了使用 each_with_index 遍历 while 循环中的所有元素,我们可以利用它并且只遍历未排序的元素。请检查要点:gist.github.com/shanshaji/5da49d1177cdf1cdc981f3dacc005b56【参考方案2】:
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

【讨论】:

哦,嵌套的 do 块,真的很优雅,谢谢【参考方案3】:
def bubble_sort(array)
    array_length = array.length
    return array if array_length <= 1
    unsorted_until_index = array_length - 1
    sorted = false
    until sorted
        sorted = true
        for i in (0..unsorted_until_index)
            if array[i+1]
                if array[i] > array[i+1]
                    array[i], array[i+1] = array[i+1], array[i]
                    sorted = false
                end
            end
        end
        unsorted_until_index -= 1
    end
    return array
end

我看到很多答案,每个人都在 while 循环内迭代或循环数组的长度。冒泡排序之所以称为冒泡排序,是因为在每次传递中,未排序的最高值“冒泡”到其正确位置。这样就可以在即将到来的 while 循环中省略这些元素。而不是直到,while !sorted 可以使用。

【讨论】:

以上是关于有没有办法在 Ruby 中使用带有任何方法的 while 循环来执行冒泡排序算法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文件中将文本读入ruby中的数组

在ruby中,有没有办法在控制台中知道方法的作用?

有没有办法在 Ruby 中读取不同的文件类型? [关闭]

带有 scala 客户端的 ruby​​ faye 服务器

有没有办法在 mp4 中使用 ruby​​ on rails / web / html5 录制音频

如何使用 python 或(和)ruby 卸载任何应用程序