使用AlgoBuild实现排序时出现数组索引越界错误,原因何在?
问题分析与解决方案
你的问题出在数组索引的起始和范围不匹配:
核心矛盾
- 输入阶段,数组
V是按**0-based(从0开始)**填充的:FOR i = 0; i < D; i = i + 1,所以V的有效索引是0到D-1,共D个元素。 - 但排序阶段的循环却用了**1-based(从1开始)**的索引范围:
- 外层循环
FOR i = 1; i <= D; i = i + 1,当i=D时,k=i=D,已经超出数组最大索引D-1; - 内层循环
FOR j = i + 1; j <= D; j = j + 1,当i=D-1时,j=D,访问V[j]就是访问V[D],直接触发索引越界错误。
- 外层循环
你提到“已将k赋值为j”,但j本身已经是超出数组有效范围的索引,所以k跟着变成无效值,自然会报错。
修正后的伪代码
把排序循环的索引逻辑改成和输入阶段一致的0-based:
PROGRAM main INPUT int D FOR i = 0; i < D; i = i + 1 INPUT V[i] END FOR // 修改排序循环的索引范围为0到D-2 FOR i = 0; i < D - 1; i = i + 1 k = i // 内层循环从i+1到D-1 FOR j = i + 1; j < D; j = j + 1 IF V[k] > V[j] k = j END IF END FOR IF i != k temp = V[i] V[i] = V[k] V[k] = temp END IF END FOR FOR i = 0; i < D; i = i + 1 OUTLN V[i] END FOR END
其他可选修正
如果你习惯用1-based索引,需要在输入阶段就调整为从1开始填充数组:
PROGRAM main INPUT int D // 输入循环改为从1到D FOR i = 1; i <= D; i = i + 1 INPUT V[i] END FOR FOR i = 1; i <= D; i = i + 1 k = i FOR j = i + 1; j <= D; j = j + 1 IF V[k] > V[j] k = j END IF END FOR IF i != k temp = V[i] V[i] = V[k] V[k] = temp END IF END FOR // 输出循环也改为从1到D FOR i = 1; i <= D; i = i + 1 OUTLN V[i] END FOR END
内容的提问来源于stack exchange,提问作者giuamato50
相关产品推荐
相关产品推荐

