29 lines
1.9 KiB
Rexx
29 lines
1.9 KiB
Rexx
/*REXX program sorts (using E-sort) a list of some interesting integers.*/
|
|
/* [↓] quotes aren't needed if all elements in a list are non-negative.*/
|
|
bell= 1 1 2 5 15 52 203 877 4140 21147 115975 /*some Bell numbers.*/
|
|
bern= '1 -1 1 0 -1 0 1 0 -1 0 5 0 -691 0 7 0 -3617' /*some Bernoulli num*/
|
|
perrin= 3 0 2 3 2 5 5 7 10 12 17 22 29 39 51 68 90 /*some Perrin nums. */
|
|
list=bell bern perrin /*throw 'em───►a pot*/
|
|
say 'unsorted =' list /*an announcement···*/
|
|
size=words(list) /*nice to have SIZE.*/
|
|
do j=1 for size /*build an array, 1 */
|
|
@.j=word(list,j) /*element at a time.*/
|
|
end /*j*/
|
|
call esort size /*sort the stuff. */
|
|
bList= /*list: null so far.*/
|
|
do k=1 for size /*build a list. */
|
|
bList=strip(bList @.k) /*append it to list.*/
|
|
end /*k*/
|
|
say ' sorted =' bList /*show & tell time. */
|
|
exit /*stick a fork in it, we're done.*/
|
|
/*──────────────────────────────────ESORT subroutine────────────────────*/
|
|
esort: procedure expose @.; parse arg N; h=N /*get the item count*/
|
|
do while h>1; h=h%2 /*partition array. */
|
|
do i=1 for N-h; j=i; k=h+i
|
|
do while @.k<@.j
|
|
parse value @.j @.k with @.k @.j /*swap two elements.*/
|
|
if h>=j then leave; j=j-h; k=k-h
|
|
end /*while @.k<@.j*/
|
|
end /*i*/
|
|
end /*while h>1*/
|
|
return
|