Chapter #2 Examples in Oz % Utility functions proc {While Expr Stmt} if {Expr} then {Stmt} {While Expr Stmt} end end proc {ArrayExchange A I J} X = A.I in A.I := A.J A.J := X end % 2.1 Insertion Sort proc {InsertionSort A} for J in 2..{Array.high A} do local Key = A.J I = {NewCell J-1} in {While fun {$} @I > 0 andthen A.@I > Key end proc {$} A.(@I+1) := A.@I I := @I - 1 end} A.(@I+1) := Key end end end local A = {Tuple.toArray 5#2#4#6#1#3} in {InsertionSort A} {Browse 'InsertionSort'#{Array.toRecord '#' A}} end % 2.2 Selection Sort proc {SelectionSort A} N = {Array.high A} in for J in 1..(N-1) do local Smallest = {NewCell J} in for I in (J+1)..N do if A.I < A.@Smallest then Smallest := I end end {ArrayExchange A J @Smallest} end end end local A = {Tuple.toArray 5#2#4#6#1#3} in {SelectionSort A} {Browse 'SelectionSort'#{Array.toRecord '#' A}} end % 2.3 Merge Sort proc {Merge A P Q R} N1 = Q - P + 1 N2 = R - Q Left = {NewArray 1 N1+1 _} Right = {NewArray 1 N2+1 _} in for I in 1..N1 do Left.I := A.(P+I-1) end for J in 1..N2 do Right.J := A.(Q+J) end Left.(N1+1) := undefined Right.(N2+1) := undefined local I = {NewCell 1} J = {NewCell 1} in for K in P..R do if Right.@J == undefined orelse (Left.@I \= undefined andthen Left.@I =< Right.@J) then A.K := Left.@I I := @I + 1 else A.K := Right.@J J := @J + 1 end end end end proc {MergeSort A P R} if P < R then local Q = (P + R) div 2 in {MergeSort A P Q} {MergeSort A Q+1 R} {Merge A P Q R} end end end local A = {Tuple.toArray 5#2#4#6#1#3} in {MergeSort A 1 {Array.high A}} {Browse 'MergeSort'#{Array.toRecord '#' A}} end % 2.3 Bubble Sort proc {BubbleSort A} for I in 1..{Array.high A} do {For {Array.high A} I+1 ~1 proc {$ J} if A.J < A.(J-1) then {ArrayExchange A J J-1} end end} end end local A = {Tuple.toArray 5#2#4#6#1#3} in {BubbleSort A} {Browse 'BubbleSort'#{Array.toRecord '#' A}} end % 2.3 Iterative Binary Search fun {IterativeBinarySearch A V Low High} Return = {NewCell nil} in {While fun {$} @Return == nil andthen @Low =< @High end proc {$} Mid = (@Low + @High) div 2 in if V == A.Mid then Return := Mid elseif V > A.Mid then Low := Mid + 1 else High := Mid - 1 end end} @Return end local A = {Tuple.toArray 10#20#30#40#50#60} Low = {NewCell {Array.low A}} High = {NewCell {Array.high A}} in {Browse 'IterativeBinarySearch'#{IterativeBinarySearch A 40 Low High}} end % 2.3 Recursive Binary Search fun {RecursiveBinarySearch A V Low High} if Low > High then nil else local Mid = (Low + High) div 2 in if V == A.Mid then Mid elseif V > A.Mid then {RecursiveBinarySearch A V Mid+1 High} else {RecursiveBinarySearch A V Low Mid-1} end end end end local A = {Tuple.toArray 10#20#30#40#50#60} Low = {Array.low A} High = {Array.high A} in {Browse 'RecursiveBinarySearch'#{RecursiveBinarySearch A 40 Low High}} end |