Sorting algorithms/Strand sort: Difference between revisions

Small improvements in second D entry
(Small improvements in second D entry)
Line 281:
 
=== Faster version using slices ===
<lang d>import std.stdio, std.rangearray;
 
T[] strandSort(T)(/*in*/ T[] list) pure nothrow {
static T[] merge(T[] left, T[] right) pure nothrow {
T[] resresult;
while (!left.empty && !right.empty) {
if (left.front <= right.front) {
resresult ~= left.front;
left = left[1 .. $]popFront;
} else {
resresult ~= right.front;
right = right[1 .. $]popFront;
}
}
return resresult ~ left ~ right;
}
 
T[] result, sorted, leftover;
while (!list.empty) {
leftoverauto sorted = list[0 .. 1];
sorted = [list.front]popFront;
list = listT[1] .. $]leftover;
foreach (item; list) {
if (sorted.back <= item ? sorted : leftover) {~= item;
sorted ~= item;
} else {
leftover ~= item;
}
}
result = merge(sorted, result);
list = leftover;
}
 
return result;
}
Line 318 ⟶ 314:
void main() {
auto arr = [-2,0,-2,5,5,3,-1,-3,5,5,0,2,-4,4,2];
arr.strandSort.writeln;
foreach (e; strandSort(arr))
write(e, " ");
}</lang>
{{out}}
<pre>[-4, -3, -2, -2, -1, 0, 0, 2, 2, 3, 4, 5, 5, 5, 5 ]</pre>
 
=={{header|Euphoria}}==