Im currently trying to make a binary insert program, it reads a random number and inserts it in a sorted list, but every time I execute the program it just returns a list full of 0's I had this problem too when creating a normal insertion one. Even before sorting the list is full of 0's (aka no elements are ever assigned for some reason)
Here's the code:
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.
I was trying to get a list of sorted random integers
binaryfindneeded for when you then still iterate over all all elements from the end to its final position ... Second: check what yourbinaryfindreturns. Most certainly it doesn't return what you expect it to return, because 1) you don't use the result of your recursive call. I'd expect something liketmp := binaryfind(...)(but I admit my pascal is a bit rusty, so it might work diffent than other languages) 2) binary search won't work on an array like1 5 0 0 0, because it's not sorted. It always return 32585 for meswapeffectively does nothing as written. You need to passe1ande2asvar. E.g.procedure swap(var e1, e2: integer);