排序
- 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)
归并排序
- 该排序属于 分治 策略
- 将一个问题分解为两个问题来计算,计算完成之后,就会得到子任务的解,这些解不是最终问题的解,还需要merge起来
算法实现
Array.prototype.mergeSort = function() {
const rec = (arr) => {
let len = arr.length;
if(len === 1) {
return arr;
}
let m = Math.floor(len / 2);
let l = arr.slice(0, mid);
let r = arr.slice(0, len);
let lo = rec(l);
let ro = rec(r);
let res = [];
let lol = lo.length;
let lor = ro.length;
while(lol || lor) {
if(lol && lor) {
res.push(lo[0] < ro[0] ? lo.shift() : ro.shift())
} else if(lol) {
res.push(lo.shift())
} else if(rol) {
res.push(ro.shift())
}
}
return res;
}
const r = rec(this);
r.forEach((n, i) => {this[i] = n;});
}
let arr = [5,4,3,2,1]
arr.insertionSort()
console.log(arr);
- 性能好,火狐的sort方法
- 思路
- 分:把数组分成2半,再递归地对子数组进行"分"操作,直到分成一个个单独的数
- 合:把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组,合并为一个完整数组
- 两个单独的数组成的数组,也是两个有序数组,这两个数组里都只有1个数
- 合这个操作,就是不断合并有序数组
- 如何合并两个有序数组
- 新建一个空数组res, 用于存放最终排序后的数组
- 比较两个有序数组的头部,较小者出队并推出res中
- 如果两个数组还有值,就重复第二步
- 两个数组都空了,合并完成
- 时间复杂度:O(nlogn)
- 分:每次把数组分成两半,用时 O(logn), log函数用于求2^? = n, 自然要?=log_2 n, 即 O(logn)
- 合:O(n), 一个while循环体