【问题标题】:Trouble creating my own bubble sort method for an Array class为 Array 类创建自己的冒泡排序方法时遇到问题
【发布时间】:2018-06-30 16:30:24
【问题描述】:

我完全理解冒泡排序的工作原理。只是给了我一个编码练习,我必须创建一个猴子修补到 Array 类的方法,其中使用了一个代码块并且它具有 spaceship 运算符。以下是我的代码:

class Array
  def bubble_sort!
    len = self.length - 1

    loop do
      swapped = false

      for i in 0...len 
        if self[i] > self[i + 1]
          self[i], self[i + 1] = self[i + 1], self[i]
          swapped = true
        end 
      end

      break if swapped == false
    end

    self
  end

  # def bubble_sort(&prc)
  # end
end

这是我的bubble_sort! 方法,但我不知道如何在块内使用“宇宙飞船操作员”<=> 来编写它。练习希望我能够将块{|num1,num2| num1 <=> num2} 升序和{|num1,num2| num2 <=> num1} 降序传递到方法中。我调用一个块没有问题,而且我理解宇宙飞船操作员如何比较其变量< == -1= == 0> == 1。我唯一的问题是我不知道如何将其写入冒泡排序的实际条件语句中。

【问题讨论】:

  • 这个问题怎么和Ruby on Rails有关?我认为标签是错误的。只是红宝石在这里很好!
  • 编辑标签 rn.
  • 排序方法的块通常用于比较两个元素以确定它们应该按什么顺序排列。那么您的冒泡排序在哪里比较事物?也许看看Comparable 以获得一些提示。

标签: arrays ruby bubble-sort spaceship-operator


【解决方案1】:

您的代码中比较元素的行是这一行:

if self[i] > self[i + 1]

使用此逻辑,如果第一个元素高于第二个元素,则交换,这意味着您的结果将按升序排序。

你可以这样替换它:

if prc.call(self[i], self[i + 1]) == 1

然后像这样调用方法:

print [5,1,4,2,3].bubble_sort! { |a,b| a <=> b }
# => [1,2,3,4,5]

print [5,1,4,2,3].bubble_sort! { |a,b| b <=> a }
# => [5,4,3,2,1]

【讨论】:

    【解决方案2】:

    尝试以下方法:

    # ....
    for i in 0...len
      condition =
        if block_given?
          yield(self[i], self[i + 1]).positive?
        else
          self[i] > self[i + 1]
        end
    
      if condition
        self[i], self[i + 1] = self[i + 1], self[i]
        swapped = true
      end
    end
    # ....
    
    
    # Usage:
    my_array.bubble_sort!
    my_array.bubble_sort! { |num1, num2| num1 <=> num2 }
    

    【讨论】:

    • 这听起来很有希望,但现在我们遇到了一个问题,如果我们想按升序获得它。
    • 我不确定我明白了。能否请您解释的更清楚些
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2020-12-19
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多