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