Skip to content

Instantly share code, notes, and snippets.

@thepeak99
Last active September 3, 2015 11:48
Show Gist options
  • Save thepeak99/15c039c20ce6ed711fc0 to your computer and use it in GitHub Desktop.
Save thepeak99/15c039c20ce6ed711fc0 to your computer and use it in GitHub Desktop.
Mergesort implemented in Mikrotik Script
: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