You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确为动态数组赋值?二叉插入程序全为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:26:34