Sorting algorithms/Heapsort: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: changed the default array from a modern Greek alphabet to an epichoric alphabet, added/changed comments and whitespace, added whitespace before assignments (that have literals).)
Line 3,162:
 
Indexing of the array (for this version) starts with   '''1'''   (one),   but can be programmed to start with zero.
<lang rexx>/*REXX programpgm sorts an array (names of modernepichoric Greek letters) using a heapsort algorithm.*/
@.=; @.1= 'alpha' ; @.67 = "zeta" ; ; @.1113= 'lambdamu' ; ; @.1619= "piqoppa" ; @.2125= 'phichi'
@.2= 'beta' ; @.78 = "eta" ; ; @.1214= 'munu' ; @.1720= "rho" ; @.2226= 'chipsi'
@.3= 'gamma' ; @.89 = "theta"; ; @.1315= 'nuxi' ; @.1821= "sigma" ; @.2327= 'psiomega'
@.4= 'delta' ; @.910= ="iota" ; @.1416= 'xiomicron' ; @.1922= "tau" ; @.24='omega'
@.5= 'epsilondigamma'; @.1011= "kappa"; ; @.1517= 'omicronpi'; ; @.2023= "upsilon"
@.6= 'epsilon'; @.12= "lambda"; do #=1 while @.#\=18= 'san'; end; ; #@.24=#-1 /*find # entries.*/"phi"
do #=1 until @.#==''; end; #=# - 1 /*find # entries.*/
call show "before sort:"
call heapSort #; say copies('▒', 40) /*sort; show sep.*/
Line 3,175 ⟶ 3,176:
/*──────────────────────────────────────────────────────────────────────────────────────*/
heapSort: procedure expose @.; arg n; do j=n%2 by -1 to 1; call shuffle j,n; end /*j*/
do n=n by -1 to 2; _=@.1; @.1=@.n; @.n=_; call shuffle 1, n-1
end /*n*/ /* [↑] swap two elements; and shuffle.*/
return
Line 3,186 ⟶ 3,187:
@.i=$; return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do es=1 for #; say ' element' right(es, length(#)) arg(1) @.es; end; return</lang>
'''{{out|output''' |text=&nbsp; when using the (default) &nbsp; (epichoric Greek alphabet) &nbsp; for input:}}
<pre>
element 1 before sort: alpha
Line 3,193 ⟶ 3,194:
element 3 before sort: gamma
element 4 before sort: delta
element 5 before sort: epsilondigamma
element 6 before sort: zetaepsilon
element 7 before sort: etazeta
element 8 before sort: thetaeta
element 9 before sort: iotatheta
element 10 before sort: kappaiota
element 11 before sort: lambdakappa
element 12 before sort: mulambda
element 13 before sort: numu
element 14 before sort: xinu
element 15 before sort: omicronxi
element 16 before sort: piomicron
element 17 before sort: rhopi
element 18 before sort: sigmasan
element 19 before sort: tauqoppa
element 20 before sort: upsilonrho
element 21 before sort: phisigma
element 22 before sort: chitau
element 23 before sort: psiupsilon
element 24 before sort: omegaphi
element 25 before sort: chi
element 26 before sort: psi
element 27 before sort: omega
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
element 1 after sort: alpha
Line 3,218 ⟶ 3,222:
element 3 after sort: chi
element 4 after sort: delta
element 5 after sort: epsilondigamma
element 6 after sort: etaepsilon
element 7 after sort: gammaeta
element 8 after sort: iotagamma
element 9 after sort: kappaiota
element 10 after sort: lambdakappa
element 11 after sort: mulambda
element 12 after sort: numu
element 13 after sort: omeganu
element 14 after sort: omicronomega
element 15 after sort: phiomicron
element 16 after sort: piphi
element 17 after sort: psipi
element 18 after sort: rhopsi
element 19 after sort: sigmaqoppa
element 20 after sort: taurho
element 21 after sort: thetasan
element 22 after sort: upsilonsigma
element 23 after sort: xitau
element 24 after sort: zetatheta
element 25 after sort: upsilon
element 26 after sort: xi
element 27 after sort: zeta
</pre>
 
===version 2===
This REXX version creates a stemmed array from a list &nbsp; (it can be numbers or characters).
<lang rexx>/*REXX programpgm sorts aan listarray (names of modernepichoric Greek letters) using a heapsort algorithm.*/
parse arg g /*obtain optional argumentarguments from the CL.*/
if g='' then g= 'alpha beta gamma delta digamma epsilon zeta eta theta iota kappa lambda mu nu',
"mu nu xi omicron pi san qoppa rho sigma tau upsilon phi chi psi omega" /*adjust # [↓] */
#=words(g); do #i=1 for words(g)#; @.#i=word(g,#i); end; /*assign #=#-1to @. */
call show "before sort:"
call heapSort #; say copies('▒', 40) /*sort; show sep*/
call show " after sort:"
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
heapSort: procedure expose @.; arg n; do j=n%2 by -1 to 1; call shuffle j,n; end /*j*/
do n=n by -1 to 2; _=@.1; @.1=@.n; @.n=_; call shuffle 1, n-1
end /*n*/ /* [↑] swap two elements; and shuffle.*/
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
shuffle: procedure expose @.; parse arg i,n; $=@.i /*obtain parent. */
do while i+i<=n; j=i+i; k=j+1
if k<=n then if @.k>@.j then j=k
Line 3,264 ⟶ 3,271:
@.i=$; return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do es=1 for #; say ' element' right(es, length(#)) arg(1) @.es; end; return</lang>
'''{{out|output''' |text=&nbsp; is theidentical same asto the 1<sup>st</sup> REXX version when using the default input &nbsp; (an epichoric Greek alphabet).}}
 
 
'''{{out|output''' |text=&nbsp; when using the following for input: &nbsp; &nbsp; <tt> 19 &nbsp;0 &nbsp;-.2 &nbsp;.1 &nbsp;1e5 &nbsp;19 &nbsp;17 &nbsp;-6 &nbsp;789 &nbsp;11 &nbsp;37 </tt>}}
<pre>
element 1 before sort: 19