From 9fe41bb219af87601512edf756489977c1e29c86 Mon Sep 17 00:00:00 2001 From: Nur69 <60115902+Nur69@users.noreply.github.com> Date: Sun, 19 Apr 2020 17:10:25 +0200 Subject: [PATCH] Topological Sort directed graphs --- Sorts/TopologicalSort,js | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Sorts/TopologicalSort,js diff --git a/Sorts/TopologicalSort,js b/Sorts/TopologicalSort,js new file mode 100644 index 000000000..e76bfd666 --- /dev/null +++ b/Sorts/TopologicalSort,js @@ -0,0 +1,59 @@ +function TopologicalSorter() { + var graph = {}, + isVisitedNode, + finishTimeCount, + finishingTimeList, + nextNode; + + this.addOrder = function (nodeA, nodeB) { + nodeA = String(nodeA); + nodeB = String(nodeB); + graph[nodeA] = graph[nodeA] || []; + graph[nodeA].push(nodeB); + } + + this.sortAndGetOrderedItems = function () { + isVisitedNode = Object.create(null); + finishTimeCount = 0; + finishingTimeList = []; + + for (var node in graph) { + if (graph.hasOwnProperty(node) && !isVisitedNode[node]) { + dfsTraverse(node); + } + } + + finishingTimeList.sort(function (item1, item2) { + return item1.finishTime > item2.finishTime ? -1 : 1; + }); + + return finishingTimeList.map(function (value) { return value.node }) + } + + function dfsTraverse(node) { + isVisitedNode[node] = true; + if (graph[node]) { + for (var i = 0; i < graph[node].length; i++) { + nextNode = graph[node][i]; + if (isVisitedNode[nextNode]) continue; + dfsTraverse(nextNode); + } + } + + finishingTimeList.push({ + node: node, + finishTime: ++finishTimeCount + }); + } +} + + +/* TEST */ +var topoSorter = new TopologicalSorter(); +topoSorter.addOrder(5, 2); +topoSorter.addOrder(5, 0); +topoSorter.addOrder(4, 0); +topoSorter.addOrder(4, 1); +topoSorter.addOrder(2, 3); +topoSorter.addOrder(3, 1); +console.log(topoSorter.sortAndGetOrderedItems());