@@ -28,25 +28,13 @@ module.exports = class PriorityQueue {
28
28
29
29
insert ( value ) {
30
30
const heap = this [ kHeap ] ;
31
- let pos = ++ this [ kSize ] ;
31
+ const pos = ++ this [ kSize ] ;
32
+ heap [ pos ] = value ;
32
33
33
34
if ( heap . length === pos )
34
35
heap . length *= 2 ;
35
36
36
- const compare = this [ kCompare ] ;
37
- const setPosition = this [ kSetPosition ] ;
38
- while ( pos > 1 ) {
39
- const parent = heap [ pos / 2 | 0 ] ;
40
- if ( compare ( parent , value ) <= 0 )
41
- break ;
42
- heap [ pos ] = parent ;
43
- if ( setPosition !== undefined )
44
- setPosition ( parent , pos ) ;
45
- pos = pos / 2 | 0 ;
46
- }
47
- heap [ pos ] = value ;
48
- if ( setPosition !== undefined )
49
- setPosition ( value , pos ) ;
37
+ this . percolateUp ( pos ) ;
50
38
}
51
39
52
40
peek ( ) {
@@ -77,18 +65,37 @@ module.exports = class PriorityQueue {
77
65
setPosition ( item , pos ) ;
78
66
}
79
67
68
+ percolateUp ( pos ) {
69
+ const heap = this [ kHeap ] ;
70
+ const compare = this [ kCompare ] ;
71
+ const setPosition = this [ kSetPosition ] ;
72
+ const item = heap [ pos ] ;
73
+
74
+ while ( pos > 1 ) {
75
+ const parent = heap [ pos / 2 | 0 ] ;
76
+ if ( compare ( parent , item ) <= 0 )
77
+ break ;
78
+ heap [ pos ] = parent ;
79
+ if ( setPosition !== undefined )
80
+ setPosition ( parent , pos ) ;
81
+ pos = pos / 2 | 0 ;
82
+ }
83
+ heap [ pos ] = item ;
84
+ if ( setPosition !== undefined )
85
+ setPosition ( item , pos ) ;
86
+ }
87
+
80
88
removeAt ( pos ) {
81
89
const heap = this [ kHeap ] ;
82
90
const size = -- this [ kSize ] ;
83
91
heap [ pos ] = heap [ size + 1 ] ;
84
92
heap [ size + 1 ] = undefined ;
85
93
86
- if ( size > 0 ) {
87
- // If not removing the last item, update the shifted item's position.
88
- if ( pos <= size && this [ kSetPosition ] !== undefined )
89
- this [ kSetPosition ] ( heap [ pos ] , pos ) ;
90
-
91
- this . percolateDown ( 1 ) ;
94
+ if ( size > 0 && pos <= size ) {
95
+ if ( pos > 1 && this [ kCompare ] ( heap [ pos / 2 | 0 ] , heap [ pos ] ) > 0 )
96
+ this . percolateUp ( pos ) ;
97
+ else
98
+ this . percolateDown ( pos ) ;
92
99
}
93
100
}
94
101
0 commit comments