/frames 8 def /rows 8 def /NN 420 def /MM 90 def /N NN def /M NN def /NN 301 def /MM 5 def /N NN def /M NN def /Ndots NN def %include /u/rs/book3/pslib/tools.ps %include /u/rs/book3/pslib/dots.ps /dy 3 def /dx 3 def /TOP 321 def /OFF1 5 def /OFF2 30 def /OFF3 30 def /myscale {dy mul TOP exch sub exch dx mul exch} def /stacksize { /calls calls 1 add def count 2 sub 2 div calls myscale lineto gsave currentpoint newpath 1 0 360 arc fill grestore } def /drawinit { 0 translate .5 setlinewidth 0 setcolor 0 0 myscale moveto /calls 0 def } def /drawlines { currentpoint stroke exch pop 0 exch moveto 0 0 myscale lineto 0 setlinewidth stroke } def /swap {/ii exch def /jj exch def A ii get /t exch def A ii A jj get put A jj t put } def /partition { /r exch def /l exch def /v A r get def /j r def /i l 1 sub def { { /j j 1 sub def j 0 lt { exit } if A j get v le { exit } if } loop { /i i 1 add def A i get v ge { exit } if } loop j i lt { exit } if j i swap } loop r i swap i } def /quicksort { stacksize 2 copy partition 1 sub dup 2 add 3 -1 roll % l i-1 i+1 r 2 copy exch sub MM gt { quicksort } { pop pop } ifelse 2 copy exch sub MM gt { quicksort } { pop pop } ifelse } def /compareswap {/jj exch def /ii exch def A ii get A jj get gt { jj ii swap} if } def /hsort { /inc exch def inc 1 N 1 sub { /k exch def k inc neg inc { dup inc sub compareswap } for } for } def /N 420 def OFF1 drawinit N randomperm /A exch def /A [0 A aload pop ] def /LL 1 def /RR N 1 sub def LL RR quicksort drawlines OFF2 drawinit N randomperm /A exch def /A [0 A aload pop ] def /LL 1 def /RR N 1 sub def LL RR quicksort drawlines OFF3 drawinit 3 testarray /A exch def /A [0 A aload pop ] def /LL 1 def /RR N 1 sub def LL RR quicksort drawlines --------------------------------------- T 27pc Stack size for Quicksort The recursive stack for Quicksort does not grow very large for random files, but can take excessive space for degenerate files. The stack size for two random files ({\it left, middle}) and a partially ordered file ({\it right}) is plotted here.