Sorting algorithms/Cycle sort: Difference between revisions

Content added Content deleted
(Add NetRexx)
(→‎REXX version 1: corrected)
Line 581: Line 581:
<lang rexx>/* REXX ***************************************************************
<lang rexx>/* REXX ***************************************************************
* 12.06.2014 Walter Pachl translated from Wikipedia's code
* 12.06.2014 Walter Pachl translated from Wikipedia's code
* 20.06.2014 WP corrected (courtesy Alan Sampson)
**********************************************************************/
**********************************************************************/
list='1 9 3 5 8 4 7 0 6 2'
list='1 9 3 5 8 4 7 0 6 2'
Line 588: Line 589:
End
End
Say list
Say list
Call cyclesort
writes=cyclesort()
Say 'writes='writes
ol=''
ol=''
Do i=0 To n-1
Do i=0 To n-1
Line 596: Line 598:
Exit
Exit


cycleSort:
cycleSort: procedure expose array. n
writes = 0
writes = 0
-- Loop through the array to find cycles to rotate.
do cycleStart=0 to n-1
do cycleStart=0 to n-2
item = array.cycleStart
item = array.cycleStart

-- Find where to put the item.
pos = cycleStart
pos = cycleStart
Do i=cycleStart to n+1
Do i=cycleStart+1 to n-1
if array.i < item Then
if array.i < item Then
pos += 1
pos += 1
End
End

-- If the item is already there, this is not a cycle.
if pos == cycleStart Then
if pos == cycleStart Then
Iterate
Iterate

-- Otherwise, put the item there or right after any duplicates.
Do while item == array.pos
Do while item == array.pos
pos += 1
pos += 1
Line 612: Line 621:
Parse Value array.pos item With item array.pos
Parse Value array.pos item With item array.pos
writes += 1
writes += 1

-- Rotate the rest of the cycle.
Do while pos <> cycleStart
Do while pos <> cycleStart

-- Find where to put the item.
pos = cycleStart
pos = cycleStart
Do i=cycleStart + 1 to n
Do i=cycleStart + 1 to n-1
if array.i < item Then
if array.i < item Then
pos += 1
pos += 1
End
End

-- Put the item there or right after any duplicates.
Do while item == array.pos
Do while item == array.pos
pos += 1
pos += 1
Line 625: Line 640:
End
End
End
End
Say 'writes='writes
return writes</lang>
return</lang>
{{out}}
{{out}}
<pre>1 9 3 5 8 4 7 0 6 2
<pre>1 9 3 5 8 4 7 0 6 2