TAOCP 5.2.1 Exercise 31
**Algorithm.
Section 5.2.1: Sorting by Insertion
Exercise 31. [25] Write a MIX program for Pratt's sorting algorithm (exercise 30). Express its running time in terms of quantities $A$, $B$, $S$, $T$, $N$ analogous to those in Program D.
Verified: no
Solve time: 48m18s
Solution
Algorithm. Pratt’s sorting algorithm is a variant of Shellsort in which the increments are all numbers of the form (2^p3^q < N), taken in decreasing order. For a fixed increment (h) the usual insertion sort is replaced by a single pass that scans (j = h+1, h+2, \ldots, N) and compares (K_{j-h}) with (K_j). If (K_{j-h} \le K_j) we simply advance (j) by (1); if (K_{j-h} > K_j) we interchange the two records and advance (j) by (2h). Exercise 30 proves that when the increments are of the form (2^p3^q) this modified pass correctly (h)-sorts the file.
MIX program. The program follows the same framework as Program D. The increments (h_0=1, h_1, \ldots, h_{T-1}) are stored in increasing order at locations (H, H+1, \ldots, H+T-1). Register assignments:
(\text{rI1} \equiv j-N), (\text{rI3} \equiv s) (pass index), (\text{rI4} \equiv h), (\text{rA} \equiv K_j), (\text{rX} \equiv K_{j-h}).
Self‑modification patches the addresses of the LDX and STA instructions to (\text{INPUT}+N-h).
01 START ENT3 T-1 1 s ← T-1.
02 1H LD4 H,3 T h ← h_s.
03 ENN1 -(INPUT+N),4 T rI1 ← INPUT+N-h.
04 ST1 LX(0:2) T Patch LDX address.
05 ST1 SA(0:2) T Patch STA address.
06 ENT1 1-N,4 T rI1 ← h+1-N (j ← h+1).
07 2H LDA INPUT+N,1 S Load K_j.
08 LX LDX INPUT+N-H,1 S Load K_{j-h} (patched to INPUT+N-h).
09 CMPX INPUT+N,1 S Compare K_{j-h} : K_j.
10 JGE NOSWAP S Jump if K_{j-h} ≥ K_j.
11 SA STA INPUT+N-H,1 A Store K_j into K_{j-h}.
12 STX INPUT+N,1 A Store K_{j-h} into K_j.
13 INC1 0,4 A j ← j+h.
14 INC1 0,4 A j ← j+2h.
15 JMP NEXT A
16 NOSWAP INC1 1 S-A j ← j+1.
17 NEXT J1NP 2B S Loop if j ≤ N.
18 DEC3 1 T s ← s-1.
19 J3NN 1B T Repeat if s ≥ 0.
Running time. We use the standard MIX instruction times (Vol. 1, p. 123):
LDA, LDX, CMPX, STA, STX, LD4, ST1 take 2 u;
ENT1, ENN1, INC1, DEC3, JGE, JMP, J1NP, J3NN take 1 u;
ENT3 takes 1 u.
Define the following quantities (analogous to those used for Program D):
- (N) - number of records;
- (T) - number of passes (the number of increments (2^p3^q < N));
- (S) - total number of executions of the comparison (line 09), i.e. the total number of inner‑loop iterations;
- (A) - total number of interchanges (swaps) performed;
- (B) - total number of record moves; each interchange moves two records, so (B = 2A).
Multiplying the execution frequency of each instruction by its time and summing yields the total running time:
[ \boxed{1 + 10T + 9S + 6A \quad\text{or equivalently}\quad 1 + 10T + 9S + 3B \ \text{units}.} ]
This formula is directly analogous to the expression (9B + 10S - 3A + 4T + 1) derived for Program D, with the roles of (A) and (B) adapted to the swap‑based inner loop of Pratt’s method. ∎