QSort in D: is this best?
bearophile
bearophileHUGS at lycos.com
Tue Dec 22 16:26:01 PST 2009
Philippe Sigaud:
> merge2 is greedy and works only for two ranges (hence it's name), but I have
> a templated, predicate-aliased, lazy, n-ranges version called merge in the
> module.
This is how merge is implemented in the heapq module of the Python standard lib:
def merge(*iterables):
h = []
for itnum, it in enumerate(map(iter, iterables)):
try:
next = it.next
h.append([next(), itnum, next])
except StopIteration:
pass
heapify(h)
while True:
try:
while True:
v, itnum, next = s = h[0] # raises IndexError when h is empty
yield v
s[0] = next() # raises StopIteration when exhausted
heapreplace(h, s) # restore heap condition
except StopIteration:
heappop(h) # remove empty iterator
except IndexError:
return
Bye,
bearophile
More information about the Digitalmars-d
mailing list