-1

我完全理解冒泡排序的工作原理。只是给了我一个编码练习,我必须创建一个猴子修补到 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. 我唯一的问题是我不知道如何将其写入冒泡排序的实际条件语句中。

4

2 回答 2

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]
于 2018-01-22T06:11:37.427 回答
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 }
于 2018-01-22T06:23:49.867 回答