1+ /**
2+ * Merge Sort is an algorithm where the main list is divided down into two half
3+ * sized lists, which then have merge sort called on these two smaller lists
4+ * recursively until there is only a sorted list of one.
5+ *
6+ * On the way up the recursive calls, the lists will be merged together inserting
7+ * the smaller value first, creating a larger sorted list.
8+ */
9+
10+ /**
11+ * Sort and merge two given arrays
12+ * @param {Array } list1 - sublist to break down
13+ * @param {Array } list2 - sublist to break down
14+ * @return {Array } merged list
15+ */
16+ function merge ( list1 , list2 ) {
17+ var results = [ ] ;
18+
19+ while ( list1 . length && list2 . length ) {
20+ if ( list1 [ 0 ] <= list2 [ 0 ] ) {
21+ results . push ( list1 . shift ( ) ) ;
22+ } else {
23+ results . push ( list2 . shift ( ) ) ;
24+ }
25+ }
26+ return results . concat ( list1 , list2 ) ;
27+ }
28+
29+ /**
30+ * Break down the lists into smaller pieces to be merged
31+ * @param {Array } list - list to be sorted
32+ * @return {Array } sorted list
33+ */
34+ function mergeSort ( list ) {
35+ if ( list . length < 2 ) return list ;
36+
37+ var listHalf = Math . floor ( list . length / 2 ) ;
38+ var subList1 = list . slice ( 0 , listHalf ) ;
39+ var subList2 = list . slice ( listHalf , list . length ) ;
40+
41+ return merge ( mergeSort ( subList1 ) , mergeSort ( subList2 ) ) ;
42+ }
43+
44+ // Merge Sort Example
45+ var unsortedArray = [ 10 , 5 , 3 , 8 , 2 , 6 , 4 , 7 , 9 , 1 ] ;
46+ var sortedArray = mergeSort ( unsortedArray ) ;
47+
48+ console . log ( 'Before:' , unsortedArray , 'After:' , sortedArray ) ;
0 commit comments