如何找出这段插入排序代码的Bug?有哪些触发错误排序的示例?
插入排序Bug排查方法
- 先对齐算法核心逻辑:插入排序的内层循环需要将当前元素与前面所有更大的元素逐个后移,直到到达数组起始位置,你的代码中内层while循环的边界条件不符合要求,没有覆盖数组下标为0的情况
- 新增调试打印验证:可以在while循环前后打印
j、当前比较的key、下标i以及数组_A的实时值,就能清晰看到当key比下标0的元素更小时,内层循环不会执行,0号元素永远不会参与比较移动 - 用最简测试用例复现:优先用长度为2、3的短数组测试,比长数组更容易定位边界问题
触发排序错误的示例
最简单的测试用例如下:
test_arr = [2, 1] insertion_sort(test_arr, 2) print(test_arr)
预期排序结果为[1, 2],实际运行后输出为[2, 1],排序完全失效。
更长的测试用例也可以复现问题:输入[4,3,2,1],实际输出为[4,1,2,3],首元素永远停留在0号位置。
修复方案
仅需将while循环的判断条件i>0修改为i >= 0即可,修复后代码:
def insertion_sort(_A,n): # _A[0..n-1] for j in range(1,n): key = _A[j] i = j-1 while i >= 0 and _A[i]>key: _A[i+1] = _A[i] i = i-1 _A[i+1] = key
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

