|
| 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); |
| 49 | + |
0 commit comments