Chapter #7 Examples in Oz % Utility functions fun {RandomInt Min Max} X = {OS.rand} MinOS MaxOS in {OS.randLimits ?MinOS ?MaxOS} Min + X*(Max - Min) div (MaxOS - MinOS) end {OS.srand 0} proc {While Expr Stmt} if {Expr} then {Stmt} {While Expr Stmt} end end proc {RepeatUntil Stmt Expr} {Stmt} if {Not {Expr}} then {RepeatUntil Stmt Expr} end end proc {ArrayExchange A I J} X = A.I in A.I := A.J A.J := X end % 7.1 Quicksort proc {QuickSort A P R} if P < R then local Q = {Partition A P R} in {QuickSort A P Q-1} {QuickSort A Q+1 R} end end end fun {Partition A P R} X = A.R I = {NewCell P-1} in for J in P..(R-1) do if A.J =< X then I := @I + 1 {ArrayExchange A @I J} end end {ArrayExchange A @I+1 R} @I + 1 end local A = {Tuple.toArray 5#2#4#6#1#3} in {QuickSort A 1 {Array.high A}} {Browse 'QuickSort'#{Array.toRecord '#' A}} end % 7.3 Randomized Quicksort fun {RandomizedPartition A P R} I = {RandomInt P R} in {ArrayExchange A R I} {Partition A P R} end proc {RandomizedQuickSort A P R} if P =< R then local Q = {RandomizedPartition A P R} in {RandomizedQuickSort A P Q-1} {RandomizedQuickSort A Q+1 R} end end end local A = {Tuple.toArray 5#2#4#6#1#3} in {RandomizedQuickSort A 1 {Array.high A}} {Browse 'RandomizedQuickSort'#{Array.toRecord '#' A}} end % 7.4 Hoare-Partition fun {HoarePartition A P R} X = A.P I = {NewCell P-1} J = {NewCell R+1} Return = {NewCell false} in {While fun {$} {Not @Return} end proc {$} {RepeatUntil proc {$} J := @J - 1 end fun {$} A.@J =< X end} {RepeatUntil proc {$} I := @I + 1 end fun {$} A.@I >= X end} if @I < @J then {ArrayExchange A @I @J} else Return := true end end} @J end proc {HoareQuickSort A P R} if P < R then local Q = {HoarePartition A P R} in {HoareQuickSort A P Q} {HoareQuickSort A Q+1 R} end end end local A = {Tuple.toArray 5#2#4#6#1#3} in {HoareQuickSort A 1 {Array.high A}} {Browse 'HoareQuickSort'#{Array.toRecord '#' A}} end % 7.4 Stooge-Sort proc {StoogeSort A I J} if A.I > A.J then {ArrayExchange A I J} end if I + 1 >= J then skip else local K = (J - I + 1) div 3 in {StoogeSort A I J-K} {StoogeSort A I+K J} {StoogeSort A I J-K} end end end local A = {Tuple.toArray 5#2#4#6#1#3} in {StoogeSort A 1 {Array.high A}} {Browse 'StoogeSort'#{Array.toRecord '#' A}} end % 7.4 Quicksort' proc {QuickSort_ A P R} {While fun {$} @P < R end proc {$} Q = {Partition A @P R} in {QuickSort_ A P Q-1} P := Q + 1 end} end local A = {Tuple.toArray 5#2#4#6#1#3} in {QuickSort_ A {NewCell 1} {Array.high A}} {Browse 'QuickSort_'#{Array.toRecord '#' A}} end |