如何正确为动态数组赋值?二叉插入程序全为0问题排查
问题分析与修复方案
你的代码存在几个关键问题,导致数组始终无法正确赋值排序:
1. 递归函数未返回结果
binaryfind的递归分支没有将递归调用的结果赋值给函数名,只有基准情况有返回值,递归过程的结果完全丢失,最终返回值不可控(通常为0)。
修复:
在递归调用前添加binaryfind :=,传递递归结果:
if vector[mid] >= e then binaryfind := binaryfind(mid+1, tail, e, vector) else binaryfind := binaryfind(head, mid, e, vector);
2. Swap过程无法修改原数组
当前swap的参数是传值模式,交换的只是局部变量副本,原数组元素不会发生任何变化。
修复:
将参数改为传引用(添加var关键字):
procedure swap(var e1, e2: integer);
3. 数组参数传递错误
binaryinsert和randomsorted中的vector参数默认是传值,修改的是数组副本,原数组不会被更新。
修复:
将两个过程的vector参数改为传引用:
procedure binaryinsert(e : integer; var vector : array of integer); procedure randomsorted(var vector : array of integer);
4. 数组越界访问与插入逻辑错误
初始设置数组长度为5后,binaryinsert中直接访问vector[l](l为当前数组长度,即5),但数组索引范围是0-4,导致越界。同时插入逻辑没有正确扩容数组。
修复:
调整randomsorted,初始数组为空,每次插入前先扩容;同时修正binaryinsert的索引逻辑:
procedure randomsorted(var vector : array of integer); var i : integer; begin SetLength(vector, 0); for i := 0 to 4 do begin SetLength(vector, Length(vector)+1); binaryinsert(random(9999), vector); end; end; procedure binaryinsert(e : integer; var vector : array of integer); var i, placement, l : integer; begin l := Length(vector); // 扩容后原有效元素的最后索引是l-2,处理数组长度为1的特殊情况 if l = 1 then placement := 0 else placement := binaryfind(0, l-2, e, vector); vector[l-1] := e; for i := (l-1) downto (placement + 1) do swap(vector[i], vector[i-1]); end;
修正后的完整代码
program BinaryInsert; function binaryfind(head, tail : integer; e : integer; vector: array of integer) : integer; var mid : integer; begin mid := (head + tail) div 2; if head <> tail then begin if vector[mid] >= e then binaryfind := binaryfind(mid+1, tail, e, vector) else binaryfind := binaryfind(head, mid, e, vector); end else begin if e >= vector[mid] then binaryfind := mid + 1 else binaryfind := mid; end; end; procedure swap(var e1, e2: integer); var aux : integer; begin aux := e1; e1 := e2; e2 := aux; end; procedure binaryinsert(e : integer; var vector : array of integer); var i, placement, l : integer; begin l := Length(vector); if l = 1 then placement := 0 else placement := binaryfind(0, l-2, e, vector); vector[l-1] := e; for i := (l-1) downto (placement + 1) do swap(vector[i], vector[i-1]); end; procedure randomsorted(var vector : array of integer); var i : integer; begin SetLength(vector, 0); for i := 0 to 4 do begin SetLength(vector, Length(vector)+1); binaryinsert(random(9999), vector); end; end; var vector : array of integer ; e : integer; begin randomize; // 添加随机种子,确保每次运行生成不同随机数 randomsorted(vector); for e in vector do writeln(e); readln(e); end.
额外添加了randomize;,确保每次运行生成不同的随机数,避免结果重复。
内容的提问来源于stack exchange,提问作者Jurandy Junior
相关产品推荐
相关产品推荐

