home *** CD-ROM | disk | FTP | other *** search
- %!
-
- % PostScript merge sort
- % by Charles Hannum, 16 November 1992
-
- % Do the merge sort on a dictionary or array. `proc' is a comparison
- % procedure. If the second argument is a `dict', it is converted to
- % an array of 2-element arrays (containing the key and value) before
- % sorting. Returns the same array, sorted.
-
- % proc dict|array mergesort array
- /mergesort {
- dup type /dicttype eq {
- dup length array 0 3 -1 roll
- {2 array astore
- 2 index 2 index 3 -1 roll put
- 1 add} forall
- pop
- } if
- dup type /arraytype ne {typecheck} if
- mergesort-recurse
- exch pop
- } def
-
- % proc array mergesort-recurse proc array
- /mergesort-recurse {
- dup length
- 1 gt {
- dup length dup 2 idiv
- exch 1 index sub
- 3 copy getinterval
- 4 1 roll pop
- 0 exch 2 index 3 1 roll
- getinterval
-
- 4 2 roll
- mergesort-recurse
- 3 1 roll exch
- mergesort-recurse
- exch 4 1 roll
-
- %% save 5 1 roll
- dup length array copy exch
- dup length array copy exch
-
- dup length 3 -1 roll
- dup length 5 -1 roll
- dup length 6 2 roll
-
- {
- 4 copy 1 sub get 3 1 roll 1 sub get
- 8 index exec
- {4 2 roll} if
- 1 sub 2 copy get
- 6 -1 roll 1 sub dup 7 1 roll exch
- 7 index 3 1 roll
- put
- dup 0 eq {exit} if
- } loop
- pop pop
- 1 sub -1 0 {
- 2 copy get
- 4 index 3 1 roll
- put
- } for
- pop pop
- %% 3 -1 roll restore
- } if
- } def
-