在Ruby中使用冒泡排序对数组进行排序

时间:2017-08-21 11:24:09

标签: arrays ruby algorithm sorting

array = [4, 7, 2, 1]

sorted = false

until sorted == true
  swapped = false

  array.each_with_index do |x, i|
    if i <= array.length - 2
      if array[i] > array[i + 1]
        array[i], array[i + 1] = array[i + 1], array[i]
        swapped = true
      end
    end

    if swapped == false
      sorted = true
    end
  end
end

print array

您好,我正在尝试使用冒泡排序对数字数组进行排序。但它没有排序。有人可以帮助我实现这一点,并指出我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

您应该在循环之后放置下面的部分,因为如果在遍历数组后没有交换,则要停止。

if swapped == false
  sorted = true
end

您也可能希望使用sorted摆脱不必要的break。这是我的变体:

array = [4, 7, 2, 1]

loop do
  swapped = false

  (array.length - 1).times do |i|
    if array[i] > array[i + 1]
      array[i], array[i + 1] = array[i + 1], array[i]
      swapped = true
    end
  end

  break unless swapped
end

print array

答案 1 :(得分:1)

(原始)代码有两个主要问题:

  • 主要块应重复直到对列表进行排序。您正在使用 1 unless sorted == true,这使它只运行一次;您必须将其更改为until sorted == true;
  • swapped == false的检查必须在 array.each后保持。它的目的是在再次分析列表后没有进行交换时发出数组已排序(并结束循环)的信号。

1 在我在评论中提出这一更正后,OP同时编辑了这个问题。

固定代码:

array = [4,7,2,1]

sorted = false
until sorted == true
  swapped = false
  array.each_with_index do |x,i|
    if i <= array.length - 2
      if array[i] > array[i+1]
        array[i], array[i+1] = array[i+1], array[i]
        swapped = true
      end
    end
  end
  if swapped == false
    sorted = true
  end
end

print array

在这段代码中,很多东西都不符合Ruby的精神。我没有经验丰富的Ruby,但我可以建议你做一些改进。

# Enclose the code into a function, for easier reuse.
def bubble_sort(array)
  sorted = false
  # "sorted" is boolean; there is no need to compare it with true or false
  until sorted
    swapped = false
    array.each_with_index do |x,i|
      # exit the loop when the last item is reached
      break if i == array.length - 1

      if array[i] > array[i+1]
        array[i], array[i+1] = array[i+1], array[i]
        swapped = true
      end
    end
    # Boolean logic: it's sorted when no more items were swapped
    sorted = ! swapped
  end
  # Return the updated array
  array
end

print bubble_sort [4, 7, 2, 1]

@ danil-speransky刚刚提供了一个solution看起来更像Ruby而不是我的。