Skip to content

Commit 243aa9d

Browse files
committed
2 parents 13e7338 + 253d148 commit 243aa9d

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
function TopologicalSorter() {
2+
var graph = {},
3+
isVisitedNode,
4+
finishTimeCount,
5+
finishingTimeList,
6+
nextNode;
7+
8+
this.addOrder = function (nodeA, nodeB) {
9+
nodeA = String(nodeA);
10+
nodeB = String(nodeB);
11+
graph[nodeA] = graph[nodeA] || [];
12+
graph[nodeA].push(nodeB);
13+
}
14+
15+
this.sortAndGetOrderedItems = function () {
16+
isVisitedNode = Object.create(null);
17+
finishTimeCount = 0;
18+
finishingTimeList = [];
19+
20+
for (var node in graph) {
21+
if (graph.hasOwnProperty(node) && !isVisitedNode[node]) {
22+
dfsTraverse(node);
23+
}
24+
}
25+
26+
finishingTimeList.sort(function (item1, item2) {
27+
return item1.finishTime > item2.finishTime ? -1 : 1;
28+
});
29+
30+
return finishingTimeList.map(function (value) { return value.node })
31+
}
32+
33+
function dfsTraverse(node) {
34+
isVisitedNode[node] = true;
35+
if (graph[node]) {
36+
for (var i = 0; i < graph[node].length; i++) {
37+
nextNode = graph[node][i];
38+
if (isVisitedNode[nextNode]) continue;
39+
dfsTraverse(nextNode);
40+
}
41+
}
42+
43+
finishingTimeList.push({
44+
node: node,
45+
finishTime: ++finishTimeCount
46+
});
47+
}
48+
}
49+
50+
51+
/* TEST */
52+
var topoSorter = new TopologicalSorter();
53+
topoSorter.addOrder(5, 2);
54+
topoSorter.addOrder(5, 0);
55+
topoSorter.addOrder(4, 0);
56+
topoSorter.addOrder(4, 1);
57+
topoSorter.addOrder(2, 3);
58+
topoSorter.addOrder(3, 1);
59+
console.log(topoSorter.sortAndGetOrderedItems());

0 commit comments

Comments
 (0)