program exercise (input, output); type ArrayType = array [1..10] of integer; var list: ArrayType; i: integer; procedure Trace (list: ArrayType; left, right: integer; entering: boolean); begin if entering then begin writeln ('**** Entering mergesort:'); end else begin writeln ('**** Leaving mergesort:'); end; if right = left then begin writeln (left:3); writeln (list[left]:3); end else if right > left then begin write (left:3); for i := left+1 to right-1 do begin write (' ':3); end; writeln (right:3); for i := left to right do begin write (list[i]:3); end; writeln; end; end; procedure Merge (source: ArrayType; var destination: ArrayType; index1, bound1, index2, bound2: integer); var merging, i: integer; begin merging := index1; while (index1 <= bound1) and (index2 <= bound2) do begin if source[index1] < source[index2] then begin destination[merging] := source[index1]; index1 := index1 + 1; merging := merging + 1; end else begin destination[merging] := source[index2]; index2 := index2 + 1; merging := merging + 1; end; end; for i := index1 to bound1 do begin destination[merging] := source[i]; merging := merging + 1; end; for i := index2 to bound2 do begin destination[merging] := source[i]; merging := merging + 1; end; end; procedure Mergesort (var list: ArrayType; left, right: integer); const ENTERING = true; LEAVING = false; var middle, i: integer; tempList: ArrayType; begin Trace (list, left, right, ENTERING); if left < right then begin middle := (left+right) div 2; for i := left to right do begin tempList[i] := list[i]; end; Mergesort (tempList, left, middle); Mergesort (tempList, middle, right); Merge (list, tempList, left, middle, middle+1, right); end; Trace (list, left, right, LEAVING); end; begin write ('Please type ten numbers: '); for i := 1 to 10 do begin read (list[i]); end; readln; Mergesort (list, 1, 10); end.