5.2. Standard, Efficient Merging Algorithm
- initialize L3 to be empty.
- Repeat the following until either L1 or L2 is empty (Note: we
only execute the loop body when both are non-empty):
- look at the heads of L1 and L2, determine which is
smaller.
- Remove the smaller head from the list it is on and add it
at the end of L3.
- If L1 or L2 is non-empty (they cannot both be non-empty) then
join it to the end of L3.
This version `clobbers' L1 and L2 but that's just for simplicity.
Don't implement it this way unless the specification says it's OK to
clobber L1 and L2.
Illustrate this merging algorithm on the example (from above): L1 =
[11,99] and L2 = [2,111,222]
- L3 = empty.
- Compare the heads of L1 and L2. 11 > 2 so we remove 2 from L2
and add it to the end of L3. Result: L1 = [11,99], L2 =
[111,222], L3 = [2].
- Compare the heads of L1 and L2. 11 < 111 so we remove 11 from
L1 and add it to the end of L3. Result: L1 = [99], L2 =
[111,222], L3 = [2,11].
- Compare the heads of L1 and L2. 99 < 222 so we remove 99 from
L1 and add it to the end of L3. Result: L1 = [] (i.e. empty), L2
= [111,222], L3 = [2,11,99].
- L1 is empty but L2 is not, so we join L2 to L3. Result: L3 =
[2,11,99,111,222].
5.3. Special cases of the MERGE operation
There are two special cases of MERGE that we will need later.
INSERT a special case of MERGE
If L1 (or L2) is a singleton - a list with exactly one element (call
it E) - then MERGE(L1,L2,L3) has the same overall effect as
INSERT(E,L2,L3), and furthermore the algorithm behaves step-by-step
almost exactly like INSERT.
JOIN is a special case of MERGE
We've already seen an example where the result of JOINing two sorted
lists was sorted. What are the general conditions under which this
will happen? Let L1 and L2 be any sorted lists (in ascending order):
L1 = [A1,A2,...,An], L2 = [B1,B2,...,Bm].
When we join them we get: [A1,A2,...,An,B1,B2,...,Bm].
When will this result in a list that is sorted? What assumption(s)
do we have to make about the Ai and the Bi?
Answer: Everything in L1 must be smaller than
everything in L2.
How can we easily check this?
Answer: Compare An (the biggest in L1) to B1 (the
smallest in L2).