归并排序
归并排序算法是在分治算法基础上设计出来的一种排序算法,它可以对指定序列完成升序(由小到大)或降序(由大到小)排序,对应的时间复杂度为O(nlogn)。
归并排序是用分治思想,分治模式在每一层递归上有三个步骤:
- 分解(Divide):将n个元素分成个含n/2个元素的子序列。
- 解决(Conquer):用合并排序法对两个子序列递归的排序。
- 合并(Combine):合并两个已排序的子序列已得到排序结果。
// 归并排序
const merge_sort = (arr) => {
if(arr.length === 0) return;
const merge = (arr, left, right) => {
// 这里将数组进行拆分
if(left === right) return;
let mid = left + Math.floor((right - left) / 2);
merge(arr, left, mid);
merge(arr, mid + 1, right);
let help = [], i = 0;
let p1 = left, p2 = mid + 1;
while(p1 <= mid && p2 <= right){
// 这里将拆分好的数组进行排序
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
// 不管是哪个会存在多出来的部分都可以直接添加到后面
while(p1 <= mid){
help[i++] = arr[p1++];
}
while(p2 <= right){
help[i++] = arr[p2++];
}
for(let i = 0; i < help.length; i++){
arr[left + i] = help[i];
}
return arr;
}
merge(arr, 0, arr.length - 1);
return arr;
}
console.log(merge_sort([5, 3, 7, 5, 1])); // [ 1, 3, 5, 5, 7 ]