Sorting algorithms/Strand sort: Difference between revisions

Content added Content deleted
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}}==