/*
* MergeSort implementation.
*
* Merge Sort is an algorithm where the main list is divided down into two half sized lists, which then have merge sort
* called on these two smaller lists recursively until there is only a sorted list of one.
*
* On the way up the recursive calls, the lists will be merged together inserting
* the smaller value first, creating a larger sorted list.
*/
/**
* Sort and merge two given arrays.
*
* @param {Array} list1 Sublist to break down.
* @param {Array} list2 Sublist to break down.
* @return {Array} The merged list.
*/
export function merge(list1, list2) {
const results = []
let i = 0
let j = 0
while (i < list1.length && j < list2.length) {
if (list1[i] < list2[j]) {
results.push(list1[i++])
} else {
results.push(list2[j++])
}
}
return results.concat(list1.slice(i), list2.slice(j))
}
/**
* Break down the lists into smaller pieces to be merged.
*
* @param {Array} list List to be sorted.
* @return {Array} The sorted list.
*/
export function mergeSort(list) {
if (list.length < 2) return list
const listHalf = Math.floor(list.length / 2)
const subList1 = list.slice(0, listHalf)
const subList2 = list.slice(listHalf, list.length)
return merge(mergeSort(subList1), mergeSort(subList2))
}
Given an array of n elements, write a function to sort the array
Best case - O(n log n)
Average - O(n log n)
Worst case - O(n log n)
O(n)
arr = [1, 3, 9, 5, 0, 2]
Divide the array in two halves [1, 3, 9] and [5, 0, 2]
Recursively call merge sort function for both these halves which will provide sorted halves
=> [1, 3, 9] & [0, 2, 5]
Now merge both these halves to get the sorted array [0, 1, 2, 3, 5, 9]
arr = [1, 9, 2, 5, 7, 3, 6, 4]
Divide the array into two halves [1, 9, 2, 5] and [7, 3, 6, 4]
As you can see that the above two halves are not yet sorted, so divide both of them into two halves again.
This time we get four arrays as [1, 9], [2, 5], [7, 3] and [6, 4].
We see that the last two arrays are again not sorted, so we divide them again into two halves and we will get [7], [3], [6], and [4].
Since an array of a single element is sorted, we now have all the arrays sorted, now we only need to merge them appropriately.
First, the arrays of one element will be merged as they were divided in last, and are at top of the recursion stack, so we get [3,7] and [4,6].
Now the merge will occur accordingly to the recursion stack, [1, 9] and [2, 5] will be merged and will make [1, 2, 5, 9].
Similarly [3, 7] and [4, 6] will be merged and made [3, 4, 6, 7].
At the next stack level [1, 2, 5, 9] and [3, 4, 6, 7] will be merged and we will get the final sorted array as [1, 2, 3, 4, 5, 6, 7, 9].