目标是查看插入排序如何查找数字并将其插入到预排序数组中。我应该从数组中弹出最后一个数字并将其插入数组中的正确时间顺序位置。
该代码似乎适用于第一个示例,但不适用于第二个示例。在第二个示例中,即使数组中有整数,正确答案似乎出现在第四次迭代中。
感觉我需要break
或return
并停止在某个地方循环,但我不确定在哪里。
def insertionSort( ar)
count = ar.count
value = ar.pop
p ar << value if value >= ar.last
reversed = ar.reverse
ar.count.times do |index|
reversed.unshift(reversed.first) if reversed.count < count
if reversed[index + 1] > value
reversed[index] = reversed[index+1]
else
reversed[index] = value
end
puts reversed.reverse.join(' ')
end
end
ar = [2, 4, 6, 8, 3]
insertionSort( ar )
#=> 2 4 6 8 8
#=> 2 4 6 6 8
#=> 2 4 4 6 8
#=> 2 3 4 6 8
negatives = [-3, -6, 7, 8, 9, 5]
insertionSort( negatives )
#=> -3 -6 7 8 9 9
#=> -3 -6 7 8 8 9
#=> -3 -6 7 7 8 9
#=> -3 -6 5 7 8 9
#=> -3 5 5 7 8 9
我想通了。 我需要休息一下,然后穿上 else 语句。
def insertionSort( ar)
count = ar.count
value = ar.pop
p ar << value if value >= ar.last
reversed = ar.reverse
ar.count.times do |index|
reversed.unshift(reversed.first) if reversed.count < count
if reversed[index + 1] > value
reversed[index] = reversed[index+1]
puts reversed.reverse.join(' ')
elsif reversed[index + 1] == value
reversed.slice!(index)
puts reversed.reverse.join(' ')
break
else
reversed[index] = value
puts reversed.reverse.join(' ')
break
end
end
end
ar = [2, 4, 6, 8, 3]
insertionSort( ar )
negatives = [-3, -6, 7, 8, 9, 5]
insertionSort( negatives )