我目前正在尝试制作一个二进制插入程序,它读取一个随机数并将其插入到排序列表中,但每次我执行该程序时,它只返回一个充满 0 的列表,在创建普通插入程序时我也遇到了这个问题。即使在排序之前,列表也充满了 0(也就是由于某种原因没有分配任何元素)
这是代码:
program BinaryInsert;
function binaryfind(head, tail : integer; e : integer; vector: array of integer) : integer; //uses binary search to find the right placement for e (element) inside the vector
var
mid : integer;
begin
mid := (head + tail) div 2; //keep in mind that div returns the value rounded down
if head <> tail then
begin
if vector[mid] >= e then //>= garantees that this sorting method is stable
binaryfind(mid+1, tail, e, vector)
else
binaryfind(head, mid, e, vector);
end
else
begin
if e >= vector[mid] then
binaryfind := mid + 1 //it should take the place in front of mid (again >= garantees stability)
else
binaryfind := mid; //it should take the place before mid
end;
end;
procedure swap(e1, e2: integer);
var
aux : integer;
begin
aux := e1;
e1 := e2;
e2 := aux;
end;
procedure binaryinsert(e : integer; vector : array of integer); //actual sorting happens here
var
i, placement, l : integer;
begin
l := Length(vector);
placement := binaryfind(0, l-1, e, vector);
vector[l] := e;
for i := (l-1) downto (placement + 1) do
swap(vector[i], vector[i-1]); //reorganizes the array until the new element is at the correct placement
end;
procedure randomsorted(vector : array of integer); //creates a sorted array with n random numbers
var
i : integer;
begin
for i := 0 to Length(vector)-1 do
binaryinsert(random(9999), vector);
end;
var
vector : array of integer ;
e : integer;
begin
SetLength(vector, 5);
randomsorted(vector);
for e in vector do
writeln(e);
readln(e);
end.
我试图获取排序的随机整数列表
一些观察结果:在没有先前调用
random(9999);
的情况下调用 Randomize()
始终返回 0 作为我测试中的第一个值。对于真正的(半)随机系列,您应该在程序开始时调用 Randomize()
。
但是,在开发过程中,提供选定的常量值可能很有用,只是为了验证排序是否按预期工作。
注意
Value
和Variable
参数的区别。您在两个位置传递 vector
作为值参数,但您想保留对数组所做的更改,因此,您应该将 vector
作为变量参数传递。
最后看来
binaryinsert()
和binaryfind()
需要一些关注。您正在为超出数组末尾的 vector[l]
分配新值。可能还有其他问题。