1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import std.stdio, std.algorithm, std.random, std.array, std.range, std.traits; // To add: less and SwapStrategy template arguments. struct LazySort(Range) if (isRandomAccessRange!Range) { Range data; private size_t idx, idxSorted; bool empty() { return idx >= data.length; } ForeachType!Range front() { if (idx >= idxSorted) { immutable oldIdxSorted = idxSorted; idxSorted = min(data.length, idxSorted ? (idxSorted * 2) : 1); partialSort(data[oldIdxSorted .. $], idxSorted - oldIdxSorted); } return data[idx]; } void popFront() { idx++; } } void main() { auto A = array(iota(25)); randomShuffle(A); writeln(A); foreach (x; LazySort!(int[])(A)) write(x, " "); } |
aW1wb3J0IHN0ZC5zdGRpbywgc3RkLmFsZ29yaXRobSwgc3RkLnJhbmRvbSwgc3RkLmFycmF5LCBzdGQucmFuZ2UsIHN0ZC50cmFpdHM7CgovLyBUbyBhZGQ6IGxlc3MgYW5kIFN3YXBTdHJhdGVneSB0ZW1wbGF0ZSBhcmd1bWVudHMuCnN0cnVjdCBMYXp5U29ydChSYW5nZSkgaWYgKGlzUmFuZG9tQWNjZXNzUmFuZ2UhUmFuZ2UpIHsKICAgIFJhbmdlIGRhdGE7CiAgICBwcml2YXRlIHNpemVfdCBpZHgsIGlkeFNvcnRlZDsKCiAgICBib29sIGVtcHR5KCkgeyByZXR1cm4gaWR4ID49IGRhdGEubGVuZ3RoOyB9CgogICAgRm9yZWFjaFR5cGUhUmFuZ2UgZnJvbnQoKSB7CiAgICAgICAgaWYgKGlkeCA+PSBpZHhTb3J0ZWQpIHsKICAgICAgICAgICAgaW1tdXRhYmxlIG9sZElkeFNvcnRlZCA9IGlkeFNvcnRlZDsKICAgICAgICAgICAgaWR4U29ydGVkID0gbWluKGRhdGEubGVuZ3RoLCBpZHhTb3J0ZWQgPyAoaWR4U29ydGVkICogMikgOiAxKTsKICAgICAgICAgICAgcGFydGlhbFNvcnQoZGF0YVtvbGRJZHhTb3J0ZWQgLi4gJF0sIGlkeFNvcnRlZCAtIG9sZElkeFNvcnRlZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkYXRhW2lkeF07CiAgICB9CgogICAgdm9pZCBwb3BGcm9udCgpIHsgaWR4Kys7IH0KfQoKdm9pZCBtYWluKCkgewogICAgYXV0byBBID0gYXJyYXkoaW90YSgyNSkpOwogICAgcmFuZG9tU2h1ZmZsZShBKTsKICAgIHdyaXRlbG4oQSk7CgogICAgZm9yZWFjaCAoeDsgTGF6eVNvcnQhKGludFtdKShBKSkKICAgICAgICB3cml0ZSh4LCAiICIpOwp9


