Stable topological sort

One possibility is to compute the lexicographically least topological order. The algorithm is to maintain a priority queue containing the nodes whose effective in-degree (over nodes not yet processed) is zero. Repeatedly dequeue the node with the least label, append it to the order, decrement the effective in-degrees of its successors, enqueue the ones that now have in-degree zero. This produces 1234567890 on btilly’s example but does not in general minimize inversions.

The properties I like about this algorithm are that the output has a clean definition obviously satisfied by only one order and that, whenever there’s an inversion (node x appears after node y even though x < y), x’s largest dependency is larger than y’s largest dependency, which is an “excuse” of sorts for inverting x and y. A corollary is that, in the absence of constraints, the lex least order is sorted order.

Leave a Comment

tech