Ruby插入排序(Insertion Sort)第6轮跳过交换问题排查求助
Ruby插入排序代码问题分析
以下是代码存在的两处核心问题:
- 排序触发条件逻辑缺陷
你的代码仅在list[i] > list[i+1]成立时,才会对前i+1位的子数组执行排序调整。第6轮(对应i=6)执行完毕后,数组为[1, 2, 4, 3, 5, 6, 7, 8, 100, 99],此时索引2的4和索引3的3为逆序,但后续外层循环i走到7时,比较的是索引7的8和索引8的100,二者顺序正常不会进入if分支,这处逆序永远不会被检测和修正,最终导致排序结果错误。 - 数组操作写法存在隐藏bug
代码中list = list - list2的写法不符合预期,Ruby中数组的-运算符是求差集,会自动去除所有重复元素,如果你排序的数组包含重复值,这一步会直接丢失元素,比如输入[2,2,1]时就会出现缺值问题。
修正参考代码
你可以参考标准插入排序的实现逻辑调整代码:
def insertion_sort(list) (1...list.length).each do |i| current = list[i] j = i - 1 # 将当前元素往前插入到有序数组的正确位置 while j >= 0 && list[j] > current list[j + 1] = list[j] j -= 1 end list[j + 1] = current end list end puts insertion_sort([2,5,1,4,8,6,7,3,100,99]).inspect # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 99, 100]
内容的提问来源于stack exchange,提问作者Derek Yi
相关产品推荐
相关产品推荐

