购物网站 建设 费用,长春手机模板建站,做招聘网站需要哪些手续,百数低代码开发平台排序
排序#xff1a;把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)
归并排序
该排序属于 分治 策略将一个问题分解为两个问题来计算#xff0c;计算完成之后#xff0c;就会得到子任务的解#xff0c;这些解不是最终问题的解#xff0c;还需要merge起来…排序
排序把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)
归并排序
该排序属于 分治 策略将一个问题分解为两个问题来计算计算完成之后就会得到子任务的解这些解不是最终问题的解还需要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); // 递归下去就变成了一个数组成的数组最终有序 o orderlet 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);// 将有序数组拷贝到this上r.forEach((n, i) {this[i] n;});
}let arr [5,4,3,2,1]
arr.insertionSort()
console.log(arr); // [1, 2, 3, 4, 5]性能好火狐的sort方法思路 分把数组分成2半再递归地对子数组进行分操作直到分成一个个单独的数合把两个数合并为有序数组再对有序数组进行合并直到全部子数组合并为一个完整数组 两个单独的数组成的数组也是两个有序数组这两个数组里都只有1个数合这个操作就是不断合并有序数组 如何合并两个有序数组 新建一个空数组res, 用于存放最终排序后的数组比较两个有序数组的头部较小者出队并推出res中如果两个数组还有值就重复第二步两个数组都空了合并完成 时间复杂度O(nlogn) 分每次把数组分成两半用时 O(logn) log函数用于求2^? n, 自然要?log_2 n, 即 O(logn) 注意凡是分的操作基本都是logn 合O(n), 一个while循环体