【发布时间】:2021-11-11 15:30:40
【问题描述】:
以下是更新后的代码:
def insertion_sort(list)
num = list.length
for i in (0..(num-2))
if list[i] > list[i+1] && i == 0
list[i], list[i+1] = list[i+1], list[i]
i+=1
elsif list[i] == list[i+1]
i+=1
elsif list[i] > list[i+1] && i > 0
len = (list[0..(i+1)].length)
list2 = list[0..(i+1)]
list = list - list2
count = 0
while count <= len+1
if list2[len-1] < list2[len-2]
list2[len-2],list2[len-1]= list2[len-1],list2[len-2]
elsif list2[len-1] == list2[len-2]
count+=1
len-=len
else
count+=1
len-=1
end
end
list = list2 + list
end
end
list
end
p insertion_sort([2,1,4,8,7,3,100,99,8])
p insertion_sort([2,1,4,8,8,7,3,100,99])
p insertion_sort([3790,780,780,1,55])
总结:
- 如果两个相同的整数彼此相邻,则代码有效:[2,1,4,8,8,7,3,100,99] 并且数组大小 > 5。
- 如果两个相同的整数在随机位置:[2,1,4,8,7,3,100,99,8]。会出现以下错误 aaa.rb:4:in `>': Integer 与 nil 的比较失败 (ArgumentError)
第 4 行代码为:if list[i] > list[i+1] && i == 0
解决1.我将while循环更改为“while count
有谁知道如何解决这个问题? 提前致谢!
【问题讨论】:
-
代码对我来说很好(输出为 [1, 2, 3, 4, 7, 8, 8, 99, 100])。你又在运行哪个版本的 Ruby?
-
@CormacMulhall 当前使用 Ruby 3.0.0p0。您在哪个版本上测试了代码?谢谢!
-
用 3.0.2 和 2.7.4 测试(3 和 2 分支的最新版本)。该错误暗示
i超出列表范围,根据您的代码,我不明白为什么会发生这种情况。您确定您正在运行的代码与您在此处粘贴的代码没有什么不同? -
@CormacMulhall 实际上 [2,1,4,8,8,7,3,100,99] 上面的数组可以正常工作。但是我测试了另一个更极端的数组 [3790,1,780,55,23,50,1111,60,50],我最终得到了 ArgumentError。 “整数与零的比较失败”。无法弄清楚为什么它会超出范围......
标签: ruby insertion-sort argument-error