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

news/2024/5/17 19:01:55 标签: 算法, 归并排序, 排序

排序

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

排序>归并排序

  • 排序属于 分治 策略
  • 将一个问题分解为两个问题来计算,计算完成之后,就会得到子任务的解,这些解不是最终问题的解,还需要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 => order
        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);
    // 将有序数组拷贝到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.niftyadmin.cn/n/5128051.html

相关文章

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…

竞赛 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…

前端,HTTP协议,HTML介绍

什么是前端 前端指的是网站或应用程序的用户界面层&#xff0c;涉及到在浏览器中展现的HTML、CSS和JavaScript等技术&#xff0c;以及与用户交互的各种组件和功能。 前端开发人员负责将设计师提供的设计图和交互原型转化为实际的网页或应用程序&#xff0c;使用户可以直接与其交…

模型调参优化

模型超参数 参考链接&#xff1a;https://www.bilibili.com/video/BV1xw411q7cH/?buvidXU0E30D0C6006B7F1EE1425156434CFEC440F&from_spmidtm.recommend.0.0&is_story_h5false&midfMtk7pz9LsVpSyGt0Mcizg%3D%3D&p1&plat_id116&share_fromugc&sha…

【卖断货攻略】抢先看:美国全品类30天爆量近2亿刀!

距离10月27日黑五大促正式上线不足6小时&#xff0c;你上车了吗&#xff1f; 看到TikTok美国市场近期的GMV走势图&#xff0c;就感觉这届黑五将不简单。 为助力跨境商家在这个关键节点做好最后准备&#xff0c;本期超店有数将从选品、营销两大角度为大家盘点现阶段TikTok Shop…

力扣在线OJ——栈和队列

目录 &#x1f341;一、用两个队列实现栈 &#x1f315;&#xff08;一&#xff09;、题目&#xff08;力扣链接&#xff1a;用队列实现栈 &#xff09; &#x1f315;&#xff08;二&#xff09;、注意 &#x1f315;&#xff08;三&#xff09;、解答 ⭐️1.注意事项 ⭐…

WSL的秘钥被修改了要怎么弄

WSL的秘钥被修改了要怎么弄 gitgithub.com: Permission denied (publickey).ssh-add -l但是我是想加到github上的guiaguaide1.github.com里面哎&#xff0c;为什么这个是shengyi gitgithub.com: Permission denied (publickey). git push -u origin报错 aaaASUS:~/ML/paper/A…

Java练习题2021-4

"某游戏公司设计了一个奖励活动&#xff0c;给N个用户(1≤N≤10^7)连续编号为1到N&#xff0c;依据用户的编号S发放奖励。 发放奖励规则为&#xff1a; 公司随机设定三个非零正整数x&#xff0c;y&#xff0c;z。 如果S同时是x、y的倍数&#xff0c;奖励2张卡片&#xff1…