无法为Array类

时间:2018-01-22 04:51:50

标签: arrays ruby bubble-sort spaceship-operator

我完全理解冒泡排序的工作原理。我刚接到编码练习,我必须创建一个方法,将猴子修补到Array类,其中使用了一段代码并且它有太空船操作符。以下是我的代码:

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。我唯一的问题是我不知道如何将其写入泡沫排序的实际条件语句中。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

尝试以下方法:

# ....
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 }