次のコードを記述しましたが、正しい結果が得られません(たとえば、[-1、-1]と入力すると、[-1、-1、-1]が返されます。
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 res;
while (!left.empty && !right.empty) {
if (left.front <= right.front) {
res.insertBack(left.front);
left.removeFront();
} else {
res.insertBack(right.front);
right.removeFront();
}
}
res.insertBack(left[]);
res.insertBack(right[]);
return res;
}
DList!T result, sorted;
while (!list.empty) {
sorted.clear();
sorted.insertBack(list.front);
list.removeFront();
foreach (item; list) {
if (sorted.back <= item) {
sorted.insertBack(item);
list.stableLinearRemove(list[].find(item).take(1)));
}
}
result = merge(sorted, result);
}
return result;
}
void main() {
auto lst = DList!int([-1,-1]);
foreach (e; strandSort(lst))
writef("%d ", e);
}
場合によっては、stableLinearRemoveがリストからアイテムを削除しないことがあります。問題は、それが私のコードのバグなのか、それともPhobosのバグなのかということです。
Rosettacode.orgのディスカッションも参照してください。
編集:removeFrontが原因だと思います。最初のノードが削除されたときに、2番目のノードの前のノードポインタがnullに設定されることはありません。linearRemoveによってリストから削除されるアイテムがたまたま最初のノードである場合、そのアイテムは削除されません。削除機能は「前」と「後」のノードをチェックし、「前」はまだ設定されています。私がこのように書くと、それは機能します:
if (sorted.back <= item) {
sorted.insertBack(item);
if (list.front == item)
list.removeFront();
else
list.stableLinearRemove(list[].find(item).take(1)));
}