def sorted(self, iterable, cmp=cmp, key=None, reverse=False): from yaupon.data_structures.pairing_heaps import PairingHeap if reverse: mycmp = lambda x,y : -1 * cmp(x, y) else: mycmp = cmp heap = PairingHeap(backend=self, cmp=mycmp) for item in iterable: item_key = heap.getkey(item) if item_key is not None: heap.modifykey(item, (item_key[0], item_key[1] + 1)) else: item_key = item if key is not None: item_key = key(item) heap.insert(item, (item_key, 1)) while heap: min_key = heap.findminkey() min_item = heap.deletemin() for i in xrange(min_key[1]): yield min_item
def test_interleaved_insertions(backend): h = PairingHeap(backend=backend) def assertmin(x): assert h.findmin() == x assert h.deletemin() == x h.insert('a', 20) assertmin('a') h.insert('a', 10) assertmin('a') h.insert('a', 10) h.insert('b', 5) assertmin('b') assertmin('a') h.insert('a', 10) h.insert('b', 5) h.insert('c', 7) h.insert('d', 12) h.insert('e', 1) h.insert('f', 11) h.insert('g', 2) assertmin('e') assertmin('g') assertmin('b') assertmin('c') assertmin('a') assertmin('f') assertmin('d')