Lecture 05 Ticket Solution

Complete before the beginning of class on Monday, 09/12. (Will be graded for completion not correctness.)

Download this ticket in pdf format or .tex source.

\[\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\).