归并排序是采用分治法的一个典型的应用,算法复杂度为nlogn 算法步骤:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
function mergeSort(nums) {
const merge = (left, right) => {
let res = []
let n1 = left.length
let n2 = right.length
let i = 0
let j = 0
while(i < n1 && j < n2){
if(left[i] <= right[j]){
res.push(left[i])
i ++
} else{
res.push(right[j])
j ++
}
}
while(i < n1){
res.push(left[i])
i ++
}
while(j < n2){
res.push(right[j])
j ++
}
return res
}
let n = nums.length
let mid = Math.floor(n/2)
if (n <= 1){
return nums
}else{
let left = mergeSort(nums.slice(0,mid))
let right = mergeSort(nums.slice(mid))
return merge(left,right)
}
}
console.log(mergeSort([5,4,3,2,1]))
//[ 1, 2, 3, 4, 5 ]