我正在尝试在我的应用中实现合并排序功能。它将数组作为输入,对其进行排序,并输出已排序的数组。
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元素。为什么不采用完整阵列?
答案 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]