Last active
September 3, 2015 11:48
-
-
Save thepeak99/15c039c20ce6ed711fc0 to your computer and use it in GitHub Desktop.
Mergesort implemented in Mikrotik Script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
:global splitmerge do={ | |
:local left; | |
:local right; | |
:local out; | |
:local middle; | |
:local leftIdx; | |
:local rightIdx; | |
:if ($end - $start < 2) do={ | |
:return {[:pick $list $start]}; | |
} | |
:set middle (($end + $start) / 2); | |
:set left [$splitmerge list=$list start=$start end=$middle]; | |
:set right [$splitmerge list=$list start=$middle end=$end]; | |
:set leftIdx 0 | |
:set rightIdx 0 | |
:while ($leftIdx < [:len $left] || $rightIdx < [:len $right]) do={ | |
:if ($leftIdx = [:len $left]) do={ | |
:set out ($out , [:pick $right $rightIdx [:len $right]]); | |
:return $out; | |
} | |
:if ($rightIdx = [:len $right]) do={ | |
:set out ($out , [:pick $left $leftIdx [:len $left]]); | |
return $out; | |
} | |
:if ([:pick $left $leftIdx] < [:pick $right $rightIdx]) do={ | |
:set out ($out, [:pick $left $leftIdx]); | |
:set leftIdx ($leftIdx + 1); | |
} else={ | |
:set out ($out, [:pick $right $rightIdx]); | |
:set rightIdx ($rightIdx + 1); | |
} | |
} | |
:return $out; | |
} | |
:global mergesort do={ | |
:return [$splitmerge list=$1 start=0 end=[:len $1]]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment