1
1
const Comparator = require ( '../../util/comparator' ) ;
2
2
3
- const merge = ( a , b , comparator ) => {
4
- let i = 0 ;
5
- let j = 0 ;
6
- const result = [ ] ;
3
+ const merge = ( wp , arr , left , middle , right , comparator ) => {
4
+ let i = left ;
5
+ let j = middle + 1 ;
6
+ let k = i ;
7
7
8
- while ( i < a . length && j < b . length ) {
9
- result . push ( comparator . lessThan ( a [ i ] , b [ j ] ) ? a [ i ++ ] : b [ j ++ ] ) ;
8
+ while ( i <= middle && j <= right ) {
9
+ if ( comparator . lessThan ( arr [ i ] , arr [ j ] ) ) {
10
+ wp [ k ++ ] = arr [ i ++ ] ;
11
+ } else {
12
+ wp [ k ++ ] = arr [ j ++ ] ;
13
+ }
10
14
}
11
15
12
- // Concats the elements from the sub-array
13
- // that has not been included yet
14
- return result . concat ( i < a . length ? a . slice ( i ) : b . slice ( j ) ) ;
16
+ while ( i <= middle ) {
17
+ wp [ k ++ ] = arr [ i ++ ] ;
18
+ }
19
+ while ( j <= right ) {
20
+ wp [ k ++ ] = arr [ j ++ ] ;
21
+ }
22
+ while ( left <= right ) {
23
+ arr [ left ] = wp [ left ++ ] ;
24
+ }
15
25
} ;
16
26
17
27
/**
@@ -20,17 +30,15 @@ const merge = (a, b, comparator) => {
20
30
*/
21
31
const mergeSortInit = ( a , compareFn ) => {
22
32
const comparator = new Comparator ( compareFn ) ;
23
-
24
- return ( function mergeSort ( a ) {
25
- if ( a . length > 1 ) {
26
- const middle = a . length >> 1 ;
27
- const left = mergeSort ( a . slice ( 0 , middle ) ) ;
28
- const right = mergeSort ( a . slice ( middle ) ) ;
29
- a = merge ( left , right , comparator ) ;
33
+ ( function mergeSort ( wp , arr , left , right ) {
34
+ if ( right - left >= 1 ) {
35
+ const middle = Math . floor ( ( left + right ) / 2 ) ;
36
+ mergeSort ( wp , arr , left , middle ) ;
37
+ mergeSort ( wp , arr , middle + 1 , right ) ;
38
+ merge ( wp , arr , left , middle , right , comparator ) ;
30
39
}
31
-
32
- return a ;
33
- } ) ( a ) ;
40
+ } ) ( [ ] , a , 0 , a . length - 1 ) ;
41
+ return a ;
34
42
} ;
35
43
36
44
module . exports = mergeSortInit ;
0 commit comments