Sorting algorithms/Strand sort: Difference between revisions

Content added Content deleted
(→‎{{header|Perl 6}}: minor shortening: factoring take)
(→‎{{header|D}}: added faster version)
Line 231: Line 231:


=={{header|D}}==
=={{header|D}}==

=== Using doubly linked lists ===
<lang d>import std.stdio, std.container;
<lang d>import std.stdio, std.container;


Line 253: Line 255:


while (!list.empty) {
while (!list.empty) {
leftover.clear();
leftover.clear();
sorted.clear();
sorted.clear();
sorted.insertBack(list.front);
sorted.insertBack(list.front);
Line 261: Line 263:
sorted.insertBack(item);
sorted.insertBack(item);
else
else
leftover.insertBack(item);
leftover.insertBack(item);
}
}
result = merge(sorted, result);
result = merge(sorted, result);
list = leftover;
list = leftover;
}
}


Line 273: Line 275:
auto lst = DList!int([-2,0,-2,5,5,3,-1,-3,5,5,0,2,-4,4,2]);
auto lst = DList!int([-2,0,-2,5,5,3,-1,-3,5,5,0,2,-4,4,2]);
foreach (e; strandSort(lst))
foreach (e; strandSort(lst))
write(e, " ");
}</lang>
{{out}}
<pre>-4 -3 -2 -2 -1 0 0 2 2 3 4 5 5 5 5 </pre>

=== Faster version using slices ===
<lang d>T[] strandSort(T)(T[] list) {
T[] merge(T[] left, T[] right) {
T[] res;
while (!left.empty && !right.empty) {
if (left.front <= right.front) {
res ~= left.front;
left = left[1 .. $];
} else {
res ~= right.front;
right = right[1 .. $];
}
}
return res ~ left ~ right;
}

T[] result, sorted, leftover;
while (!list.empty) {
leftover = [];
sorted = [list.front];
list = list[1 .. $];
foreach (item; list) {
if (sorted.back <= item) {
sorted ~= item;
} else {
leftover ~= item;
}
}
result = merge(sorted, result);
list = leftover;
}
return result;
}

void main() {
auto arr = [-2,0,-2,5,5,3,-1,-3,5,5,0,2,-4,4,2];
foreach (e; strandSort(arr))
write(e, " ");
write(e, " ");
}</lang>
}</lang>