Sorting algorithms/Comb sort: Difference between revisions
Content added Content deleted
PatGarrett (talk | contribs) m (→{{header|360 Assembly}}: add a comment) |
m (→{{header|REXX}}: added/changed comments and whitespace.) |
||
Line 1,765: | Line 1,765: | ||
=={{header|REXX}}== |
=={{header|REXX}}== |
||
Programming note: the REXX statement (line 12) <big> '''s=trunc(s*.8)''' </big> could've been expressed as: <big> '''s=s*.8%1''' </big> (which is faster), but is more cryptic. |
Programming note: the REXX statement (line 12) <big> '''s=trunc(s*0.8)''' </big> could've been expressed as: <big> '''s=s*0.8%1''' </big> (which is faster), but is more cryptic. |
||
<lang rexx>/*REXX program sorts and displays a stemmed array using the comb sort algorithm. |
<lang rexx>/*REXX program sorts and displays a stemmed array using the comb sort algorithm. */ |
||
call gen; |
call gen; w=length(#) /*generate the @ array elements. */ |
||
call show 'before sort' /*display the before array elements. */ |
call show 'before sort' /*display the before array elements. */ |
||
say copies('▒', 60) |
say copies('▒', 60) /*display a separator line (a fence). */ |
||
call combSort |
call combSort # /*invoke the comb sort (with # entries)*/ |
||
call show ' after sort' /*display the after array elements. */ |
call show ' after sort' /*display the after array elements. */ |
||
exit /*stick a fork in it, we're all done. */ |
exit /*stick a fork in it, we're all done. */ |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
combSort: procedure expose @.; parse arg N |
combSort: procedure expose @.; parse arg N /*N: is the number of @ elements. */ |
||
s=N-1 /*S: is the spread between COMBs. |
s=N-1 /*S: is the spread between COMBs. */ |
||
do until s<=1 & done; done=1 /*assume sort is done (so far). */ |
do until s<=1 & done; done=1 /*assume sort is done (so far). */ |
||
s=trunc(s*.8) |
s=trunc(s*0.8) /*Note: ÷ is slow, * is better.*/ |
||
do j=1 until js>=N; js=j+s |
do j=1 until js>=N; js=j+s |
||
if @.j>@.js then do; _=@.j; @.j=@.js; @.js=_; done=0; end |
if @.j>@.js then do; _=@.j; @.j=@.js; @.js=_; done=0; end |
||
end /*j*/ |
end /*j*/ |
||
end /*until*/ |
end /*until*/ |
||
return |
return |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
gen: |
gen: @. = ; @.12 = "dodecagon 12" |
||
@.1 = '----polygon--- sides' ; @.13 = "tridecagon 13" |
|||
@.2 = '============== =======' ; @.14 = "tetradecagon 14" |
|||
@.3 = 'triangle 3' ; @.15 = "pentadecagon 15" |
|||
@.4 = 'quadrilateral 4' ; @.16 = "hexadecagon 16" |
|||
@.5 = 'pentagon 5' ; @.17 = "heptadecagon 17" |
|||
@.6 = 'hexagon 6' ; @.18 = "octadecagon 18" |
|||
@.7 = 'heptagon 7' ; @.19 = "enneadecagon 19" |
|||
@.8 = 'octagon 8' ; @.20 = "icosagon 20" |
|||
@.9 = 'nonagon 9' ; @.21 = "hectogon 100" |
|||
@.10 = 'decagon 10' ; @.22 = "chiliagon 1000" |
|||
@.11 = 'hendecagon 11' ; @.23 = "myriagon 10000" |
|||
do #=1 while @.#\==''; end; #=#-1 /*find how many |
do #=1 while @.#\==''; end; #=#-1 /*find how many elements in @*/ |
||
return /* [↑] adjust # because of the DO loop*/ |
|||
return |
|||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
show: do j=1 for #; say ' element' right(j,w) arg(1)":" @.j; end; return</lang> |
show: do j=1 for #; say ' element' right(j,w) arg(1)":" @.j; end; return</lang> |