The code is written in ALGOL 60. Let me answer your questions/doubts one by one:
I think the line i:=n:=n+1; in INHEAP means that i is initialized before n
This is just multiple assignment like in C and many C-like languages. Assignment should be considered an operator that can be used in an expression and evaluates to the value being assigned. So it is short for:
n:=n+1;
i:=n;
...in that order.
I think ... begin integer j; in SETHEAP is supposed to start a loop from 1 to n.
Yes, this is a bit obscure, but j is incremented by INHEAP, because the n parameter is a reference parameter (not a value parameter like in), meaning n becomes an alias for the j variable in SETHEAP. And as INHEAP increments n with the statement n:=n+1, the j of SETHEAP is incremented. If you know C++, then it is like INHEAP had declared a parameter int &n
SETHEAP calls INHEAP with the first and second elements of A as arguments.
No, that is a misunderstanding, for two reasons:
- The
INHEAP procedure is only called with one value at the time, which is the third argument: A[j+1]. The second argument j is not an array value, but represents the current size of the heap. The subarray A[1...j] is assumed to be a valid heap. This is true when the first call is made, because an array of size 1 is always a valid heap. The call of INHEAP is used to take the next value in the array that is not yet part of the heap and insert it into it, growing the heap.
- After the call to
INHEAP, j has increased (see above), and A[1...j] will now have become a valid heap. So the next time INHEAP is called it will be called with j equal to 2, and passing A[3] as third argument, ...etc.
why does INHEAP add the second element to the heap with A[i] := in?
INHEAP must assign in somewhere in the heap -- that is its role! It must shift some elements in the array to find a right spot for in (making room for it), to finally assign it there. Be aware that n is not (necessarily) the size of the whole A array; it is the size of the subarray that is already a heap. It can be confusing that both INHEAP and SETHEAP have a n variable, but it is not the same variable: for SETHEAP, n represents the size of A, while for INHEAP it represents the size of the subarray that is assumed to be a valid heap.
INHEAP does not have to do this assignment for the first element, because there is nothing to check: an array with one element has obviously that element at the only possible position, so there is nothing to move. This is why INHEAP is first called with the second element as value. And as explained above, INHEAP is called also for any element after the second position.