Sorting algorithms/Strand sort: Difference between revisions
Content added Content deleted
(→{{header|D}}: -debug stuff) |
m (Sort Clojure < CMake < Common Lisp < D.) |
||
Line 76: | Line 76: | ||
}</lang>outout<lang>before sort: -2 0 -2 5 5 3 -1 -3 5 5 0 2 -4 4 2 |
}</lang>outout<lang>before sort: -2 0 -2 5 5 3 -1 -3 5 5 0 2 -4 4 2 |
||
after sort: -4 -3 -2 -2 -1 0 0 2 2 3 4 5 5 5 5</lang> |
after sort: -4 -3 -2 -2 -1 0 0 2 2 3 4 5 5 5 5</lang> |
||
=={{header|C++}}== |
=={{header|C++}}== |
||
<lang cpp>#include <list> |
<lang cpp>#include <list> |
||
Line 99: | Line 100: | ||
return result; |
return result; |
||
}</lang> |
}</lang> |
||
=={{header|D}}== |
|||
<lang d>import std.stdio, std.range, std.container, std.algorithm; |
|||
DList!T strandSort(T)(DList!T list) { |
|||
static DList!T merge(DList!T left, DList!T right) { |
|||
DList!T result; |
|||
while (!left.empty && !right.empty) { |
|||
if (left.front <= right.front) { |
|||
result.insertBack(left.front); |
|||
left.removeFront(); |
|||
} else { |
|||
result.insertBack(right.front); |
|||
right.removeFront(); |
|||
} |
|||
} |
|||
result.insertBack(left[]); |
|||
result.insertBack(right[]); |
|||
return result; |
|||
} |
|||
DList!T result, sorted, leftover; |
|||
while (!list.empty) { |
|||
leftover.clear(); |
|||
sorted.clear(); |
|||
sorted.insertBack(list.front); |
|||
list.removeFront(); |
|||
foreach (item; list) { |
|||
if (sorted.back <= item) |
|||
sorted.insertBack(item); |
|||
else |
|||
leftover.insertBack(item); |
|||
} |
|||
result = merge(sorted, result); |
|||
list = leftover; |
|||
} |
|||
return result; |
|||
} |
|||
void main() { |
|||
auto lst = DList!int([-2,0,-2,5,5,3,-1,-3,5,5,0,2,-4,4,2]); |
|||
//auto lst = DList!int([-2,-2, 1]); |
|||
foreach (e; strandSort(lst)) |
|||
writef("%d ", e); |
|||
}</lang> |
|||
{{out}} |
|||
<pre>-4 -3 -2 -2 -1 0 0 2 2 3 4 5 5 5 5 </pre> |
|||
=={{header|Clojure}}== |
=={{header|Clojure}}== |
||
Line 269: | Line 220: | ||
(print (strand-sort r #'<)))</lang>output<lang>(5 8 6 0 6 8 4 7 0 7 1 5 3 3 6) |
(print (strand-sort r #'<)))</lang>output<lang>(5 8 6 0 6 8 4 7 0 7 1 5 3 3 6) |
||
(0 0 1 3 3 4 5 5 6 6 6 7 7 8 8)</lang> |
(0 0 1 3 3 4 5 5 6 6 6 7 7 8 8)</lang> |
||
=={{header|D}}== |
|||
<lang d>import std.stdio, std.range, std.container, std.algorithm; |
|||
DList!T strandSort(T)(DList!T list) { |
|||
static DList!T merge(DList!T left, DList!T right) { |
|||
DList!T result; |
|||
while (!left.empty && !right.empty) { |
|||
if (left.front <= right.front) { |
|||
result.insertBack(left.front); |
|||
left.removeFront(); |
|||
} else { |
|||
result.insertBack(right.front); |
|||
right.removeFront(); |
|||
} |
|||
} |
|||
result.insertBack(left[]); |
|||
result.insertBack(right[]); |
|||
return result; |
|||
} |
|||
DList!T result, sorted, leftover; |
|||
while (!list.empty) { |
|||
leftover.clear(); |
|||
sorted.clear(); |
|||
sorted.insertBack(list.front); |
|||
list.removeFront(); |
|||
foreach (item; list) { |
|||
if (sorted.back <= item) |
|||
sorted.insertBack(item); |
|||
else |
|||
leftover.insertBack(item); |
|||
} |
|||
result = merge(sorted, result); |
|||
list = leftover; |
|||
} |
|||
return result; |
|||
} |
|||
void main() { |
|||
auto lst = DList!int([-2,0,-2,5,5,3,-1,-3,5,5,0,2,-4,4,2]); |
|||
//auto lst = DList!int([-2,-2, 1]); |
|||
foreach (e; strandSort(lst)) |
|||
writef("%d ", e); |
|||
}</lang> |
|||
{{out}} |
|||
<pre>-4 -3 -2 -2 -1 0 0 2 2 3 4 5 5 5 5 </pre> |
|||
=={{header|Euphoria}}== |
=={{header|Euphoria}}== |