当前位置: 首页 > news >正文

数据结构与算法之排序: 归并排序 (Javascript版)

排序

  • 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)

归并排序

  • 该排序属于 分治 策略
  • 将一个问题分解为两个问题来计算,计算完成之后,就会得到子任务的解,这些解不是最终问题的解,还需要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循环体
http://www.lryc.cn/news/208333.html

相关文章:

  • Java练习题2021-2
  • 深度学习面试题目01
  • ESP32网络开发实例-HTTP-POST请求
  • 怎么把成绩发给家长
  • Banana Pi BPI-W3 RK3588开发板基本使用文档
  • 源码解析SpringMVC之RequestMapping注解原理
  • biocParallel学习
  • AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):一个AWTK工程
  • MySQL主从复制(基于binlog日志方式)
  • 计算机网络【CN】介质访问控制
  • CDR和AI哪个软件更好用?
  • 保姆级认识AVL树【C++】(精讲:AVL Insert)
  • pinia中使用reactive声明变量,子页面使用时,值未改变,即不是响应式的(解决方法)
  • 基于springboot零食商城管理系统
  • C++程序练习
  • Golang 继承
  • 棋盘格测距-单目相机(OpenCV/C++)
  • 031-从零搭建微服务-监控中心(一)
  • vue中使用xlsx插件导出多sheet excel实现方法
  • Linux - 进程的优先级 和 如何使用优先级调度进程
  • 支持控件drag和click
  • AIR101 LuatOS LVGL 显示多个标签例程
  • Istio实战(七)- Bookinfo 部署
  • 出差学小白知识No5:|Ubuntu上关联GitLab账号并下载项目(ssh key配置)
  • FL Studio21.2中文版多少钱?值得下载吗
  • 软考系统架构师知识点集锦三:软件架构设计
  • docker - window Docker Desktop升级
  • Element UI + Vue 新增和编辑共用表单校验无法清除问题(已解决)
  • FL Studio21最新中文汉化解锁版,2024怎么激活FL Studio
  • Mac怎么清理磁盘空间?释放Mac磁盘空间有效方法