$\def\compare{ {\mathrm{compare}} } \def\swap{ {\mathrm{swap}} } \def\sort{ {\mathrm{sort}} } \def\true{ {\mathrm{true}} } \def\false{ {\mathrm{false}} }$

Consider the following method that takes two arrays of numerical values, $$a$$ and $$b$$ as input and returns another array $$c$$:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Merge(a, b):
i, j, k <- 1
c <- new array of size size(a) + size(b)
while i <= size(a) and j <= size(b) do
if a[i] <= b[j] then
min <- a[i]
i <- i + 1
else
min <- b[j]
j <- j + 1
endif
c[k] <- min
k <- k + 1
endwhile

while i <= size(a) do
c[k] <- a[i]
i <- i + 1
k <- k + 1
endwhile

while j <= size(b) do
c[k] <- b[j]
j <- j + 1
k <- k + 1
endwhile

return c


Argue that if $$a$$ and $$b$$ are sorted, then the array $$c$$ returned by $$\mathrm{Merge}(a, b)$$ is sorted and contains every element from both $$a$$ and $$b$$. Your argument does not have to be too formal, but you should describe a loop invariant for the first while loop that explains how the procedure creates a sorted array.

### Solution

Consider the first while loop on lines 4–14. In iteration $$k$$, this loop selects the smaller of the values $$a[i]$$ and $$b[j]$$ and copies it to $$c[k]$$, then increments $$k$$ as well as the index ($$i$$ or $$j$$) of the copied element. Since $$a$$ and $$b$$ are assumed to be sorted, this procedure always selects the smallest element from $$a$$ and $$b$$ that has not yet been copied to $$c$$. In particular, after iteration $$k$$, $$c$$ contains the $$k$$ smallest elements from $$a$$ and $$b$$ in sorted order.

The first loop terminates when all of the element from $$a$$ or $$b$$ have been copied to $$c$$. The second and third while loops (lines 16–26) copy the remaining elements to $$c$$.