Sorting algorithms/Strand sort: Difference between revisions
Content added Content deleted
(→{{header|Ursala}}: Added zkl) |
m (Added the Sidef language) |
||
Line 1,450: | Line 1,450: | ||
{{out}} |
{{out}} |
||
<pre>[1, 1, 2, 3, 3, 5, 6, 7]</pre> |
<pre>[1, 1, 2, 3, 3, 5, 6, 7]</pre> |
||
=={{header|Sidef}}== |
|||
{{trans|Perl}} |
|||
<lang ruby>func merge(x, y) { |
|||
var out = []; |
|||
while (x && y) { |
|||
given (x[-1] <=> y[-1]) |
|||
> 1 { out.prepend(x.pop) } |
|||
> -1 { out.prepend(y.pop) } |
|||
: { out.prepend(x.pop, y.pop) } |
|||
}; |
|||
x + y + out; |
|||
} |
|||
func strand(x) { |
|||
x || return []; |
|||
var out = [x.shift]; |
|||
if (x.len) { |
|||
range(-x.len, -1).each { |i| |
|||
if (x[i] >= out[-1]) { |
|||
out.append(x.pop_at(i)); |
|||
} |
|||
} |
|||
}; |
|||
out; |
|||
} |
|||
func strand_sort(x) { |
|||
var out = []; |
|||
while (var strd = strand(x)) { |
|||
out = merge(out, strd); |
|||
}; |
|||
out; |
|||
} |
|||
var a = 10.of {100.rand.int}; |
|||
say "Before: #{a}"; |
|||
say "After: #{strand_sort(a.copy)}";</lang> |
|||
{{out}} |
|||
<pre> |
|||
Before: 24 62 29 95 11 21 46 3 23 20 |
|||
After: 3 11 20 21 23 24 29 46 62 95 |
|||
</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |