Ruby实现merge_sort算法,从输入数组中删除元素

时间:2017-03-16 18:42:17

标签: arrays ruby algorithm sorting

我正在尝试在我的应用中实现合并排序功能。它将数组作为输入,对其进行排序,并输出已排序的数组。

def sort(list)
  swapped = true
  sorted_list = []

  slice_count = list.size.to_i
  chunked_list = list.each_slice(slice_count).to_a.each{ |element| element.fill nil, slice_count, 0 }.transpose.map(&:compact)

  while swapped do
    swapped = false

    (slice_count-1).times do |i|
      if chunked_list[i][0] > chunked_list[i+1][0]
        chunked_list[i], chunked_list[i+1] = chunked_list[i+1], chunked_list[i]
        swapped = true
      end
    end
    break if !swapped
  end

  (slice_count-1).times do |i|
    sorted_list.push(chunked_list[i][0])
  end

  puts "Sorted list (merge): #{sorted_list}"
end

我的问题来自获取输入数组。 运行merge.sort([0,3,8,5,4,9,22])输出一个没有0和22的排序数组:Sorted list (merge): [3, 4, 5, 8, 9]

调试并返回pry中的'list'变量给我[3, 4, 5, 8, 9, 22],其中包括最终输出中不存在的22,但仍然排除了输入数组中的0元素。为什么不采用完整阵列?

1 个答案:

答案 0 :(得分:1)

你需要删除 - 1 on(slice_count).times do

def sort(list)
  swapped = true
  sorted_list = []

  slice_count = list.size.to_i
  chunked_list = list.each_slice(slice_count).to_a.each{ |element| element.fill nil, slice_count, 0 }.transpose.map(&:compact)

  while swapped do
    swapped = false

    (slice_count-1).times do |i|
      if chunked_list[i][0] > chunked_list[i+1][0]
        chunked_list[i], chunked_list[i+1] = chunked_list[i+1], chunked_list[i]
        swapped = true
      end
    end
    break if !swapped
  end

  (slice_count).times do |i|
    sorted_list.push(chunked_list[i][0])
  end

  puts "Sorted list (merge): #{sorted_list}"
end

Sorted list (merge): [0, 3, 4, 5, 8, 9, 22]