Delphi两层while循环排序数组 如何去除冗余k变量
无冗余k变量的两层嵌套循环排序实现(Delphi/Lazarus)
原代码中的k属于完全可消除的冗余变量,不需要新增额外变量存储j的初始值,也不需要调整原有排序逻辑。
观察原代码k的取值规律:k初始值为1,每轮外层循环和i同步自增1,全程满足k = i + 1的恒等关系,直接将原代码中j := k替换为j := i + 1,删除所有k相关的初始化、自增语句即可。
之前直接将j初始值固定写为1会出现逻辑错误,是因为违背了该排序逻辑的核心规则:每轮外层循环确定i位置的排序结果后,下一轮内层循环不需要回头比较i之前的元素,必须从i的下一位开始向后遍历,否则会打乱已经排好序的元素位置,导致结果错误。
修正后可正常运行的代码如下:
i := 0; while i < 4 do begin j := i + 1; while j < 5 do begin if nArray[j] < nArray[i] then begin tmp := nArray[j]; nArray[j] := nArray[i]; nArray[i] := tmp; end; j := j + 1; end; i := i + 1; end;
逐轮核对运行逻辑和原带k的代码完全一致:
- 第1轮外层循环i=0,j初始值为1,匹配原代码k=1的运行效果
- 第1轮内层循环结束后i自增为1,下一轮j初始值为2,匹配原代码k自增为2的运行效果
- 后续轮次j初始值依次为3、4,和原逻辑完全匹配,不会出现j被反复重置为1导致的循环逻辑错误、排序结果错误问题
- 代码全程仅使用i、j、tmp三个变量,保持两层while嵌套结构,未调用任何函数,完全满足作业要求。
内容的提问来源于stack exchange,提问作者RingK
相关产品推荐
相关产品推荐

