@@ -2,9 +2,9 @@ import { insertStep } from './helpers';
2
2
3
3
function mergeSort ( array , position , arraySteps , colorSteps ) {
4
4
if ( array . length === 1 ) return array ;
5
+ let mid = Math . floor ( array . length / 2 ) ;
5
6
6
- let mid = array . length / 2 ;
7
-
7
+ // Split and work recursively
8
8
let arrayA = mergeSort ( array . slice ( 0 , mid ) , position , arraySteps , colorSteps ) ;
9
9
let arrayB = mergeSort ( array . slice ( mid ) , position + mid , arraySteps , colorSteps ) ;
10
10
@@ -24,30 +24,28 @@ const merge = (arrayA, arrayB, position, arraySteps, colorSteps) => {
24
24
arrayNew . push ( arrayB . shift ( ) ) ;
25
25
insertStep ( arrayNew , position , arraySteps ) ;
26
26
}
27
-
28
- if ( position === 0 ) {
29
- let colorKey = colorSteps [ colorSteps . length - 1 ] . slice ( ) ;
30
- colorKey [ arrayNew . length - 1 ] = true ;
31
- colorSteps . push ( colorKey ) ;
32
- } else {
33
- colorSteps . push ( colorSteps [ colorSteps . length - 1 ] . slice ( ) ) ;
34
- }
27
+ updateColor ( position , colorSteps , arrayNew . length - 1 , [ 0 ] , [ ] ) ;
35
28
}
36
29
30
+ // concatenate remaining values
31
+ updateColor ( position , colorSteps , arrayNew . length , arrayA , arrayB ) ;
32
+ if ( arrayA . length !== 0 ) arrayNew = arrayNew . concat ( arrayA ) ;
33
+ if ( arrayB . length !== 0 ) arrayNew = arrayNew . concat ( arrayB ) ;
34
+ insertStep ( arrayNew , position , arraySteps ) ;
35
+
36
+ return arrayNew ;
37
+ }
38
+
39
+ function updateColor ( position , colorSteps , start , arrayA , arrayB ) {
37
40
if ( position === 0 ) {
41
+ // if sorted from the front, mark changed elements to be green
38
42
let colorKey = colorSteps [ colorSteps . length - 1 ] . slice ( ) ;
39
- colorKey . fill ( true , position + arrayNew . length , position + arrayNew . length + arrayA . length + arrayB . length ) ;
43
+ colorKey . fill ( true , start , start + arrayA . length + arrayB . length ) ;
40
44
colorSteps . push ( colorKey ) ;
41
45
} else {
46
+ // or duplicate previous step
42
47
colorSteps . push ( colorSteps [ colorSteps . length - 1 ] . slice ( ) ) ;
43
48
}
44
-
45
- if ( arrayA . length !== 0 ) arrayNew = arrayNew . concat ( arrayA ) ;
46
- if ( arrayB . length !== 0 ) arrayNew = arrayNew . concat ( arrayB ) ;
47
-
48
- insertStep ( arrayNew , position , arraySteps ) ;
49
-
50
- return arrayNew ;
51
49
}
52
50
53
51
export default mergeSort ;
0 commit comments