从二叉树角度看归并排序

news2024/10/6 10:34:27

归并排序本质上可以看作二叉树的后序遍历

里面用到的核心思想 => 分治

分:二叉树算法思想中的分解问题思想

治:链表中双指针技巧(将两条链表合并成一条有序链表)

sort首先将数组分成左半边和右半边 

=> 然后分别对左右两边再sort(递归的味道)

=>最后通过merge合并左右两边数组

将问题无限细分下去,至不能再分解(base返回),好这就到底了

开始向上返回,在向上返回的过程中不断的merge,直至顶部完成任务

放张图辅助理解一下,也帮作者推广一下

归并排序

class Merge {
private:
    vector<int> temp;
public:
    void sort(vector<int>& nums) {
        temp.resize(nums.size());
        sort(nums, 0, nums.size() - 1);
    }
private:
    void sort(vector<int>& nums, int left, int right) {
        if(left == right) return;
        int mid = left + (right - left) / 2;
        sort(nums, left, mid);
        sort(nums, mid + 1, right);
        merge(nums, left, mid, right);
    }
    void merge(vector<int>& nums, int left, int mid, int right) {
        for(int i = left; i <= right; i++) {
            temp[i] = nums[i];
        }
        int p1 = left, p2 = mid + 1;
        for(int i = left; i <= right; i++) {
            if(p1 == mid + 1) nums[i] = temp[p2++];
            else if(p2 == right + 1) nums[i] = temp[p1++];
            else if(temp[p1] < temp[p2]) nums[i] = temp[p1++];
            else if(temp[p1] > temp[p2]) nums[i] = temp[p2++];
        }
    }
};

int main() {
    vector<int> nums;
    int n;
    cin >> n;
    while(n--) {
        int num;
        cin >> num;
        nums.emplace_back(num);
    }
    (new Merge())->sort(nums);
    for(auto num: nums) {
        cout << num << " ";
    }
    return 0;
}

归并排序拓展应用

315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)

这题和归并排序的关系 => 主要在 merge 函数,我们在使用 merge 函数合并两个有序数组的时候,其实是可以知道一个元素 nums[i] 后边有多少个元素比 nums[i] 小的

因为在层层向上merge的时候每个子数组都是有序的

class Solution {
public: 
    vector<pair<int,int>> help;
    vector<int> count;
    vector<int> countSmaller(vector<int>& nums) {
        int n = nums.size();
        help.resize(n);
        count.resize(n);
        vector<pair<int,int>> arr;
        for(int i=0;i<n;i++){
            pair<int,int> temp(i, nums[i]);
            arr.push_back(temp);
        }
        process(arr,0,n-1);
        return count;
    }
    void process(vector<pair<int,int>>& arr,int left,int right){
        if(left==right) return;
        int mid = left+(right-left)/2;
        process(arr,left,mid);
        process(arr,mid+1,right);
        merge(arr,left,mid,right);
    }
    void merge(vector<pair<int,int>>& arr,int left,int mid,int right){
        for(int i=left;i<=right;i++){
            help[i] = arr[i];
        }
        int i = left, j = mid+1;
        for(int p=left;p<=right;p++){
            if(i==mid+1) arr[p] = help[j++];
            else if(j==right+1){
                arr[p] = help[i++];
                count[arr[p].first] += j-mid-1;
            }else if(help[i].second>help[j].second) arr[p] = help[j++];
            else{
                arr[p] = help[i++];
                count[arr[p].first] += j-mid-1;
            }
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Log库和配置系统结构

Log库&#xff1a; 类关系 首先有3个大类&#xff1a;LogEvent、LogAppender、Logger、LogFormat&#xff1b; 关系如下&#xff1a; Logger&#xff1a;具体log的实现 LogAppender&#xff1a;将Log信息传输到不同的目的地&#xff0c;根据不同的需求派生出不同的类 LogF…

Java 系列 Nacos

Java 系列文章 文章目录Java 系列文章前言一、Nacas 介绍及安装1. 什么是Nacos2. 为什么使用Nacos3. Nacos 下载和安装二、Nacos服务提供者注册1. Nacos代替Eureka2. Nacos服务注册中心3. Nacos Discovery引入1. 创建新项目2. POM3. YML文件4. 启动类5. 业务类6. 测试&#xff…

Git如何推送当前代码到远程仓库

第一种方法 &#xff08;建立在已经配置好用户变量和ssh基础上&#xff09; 在本地创建git仓库 git init 绑定远程仓库&#xff0c;origin是给远程仓库起的别名&#xff0c;也可以起其他名字&#xff0c;但是如果用origin&#xff0c;git push时可以不指出名字&#xff0c;如果…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)——第一章学习笔记

第一章 昇腾AI基础知识介绍 第2节 昇腾AI全栈架构 昇腾 AI 全栈可以分成四个大部分&#xff1a; 1&#xff0e;应用使能层面&#xff0c;此层面通常包含用于部署模型的软硬件&#xff0c;例如 API 、 SDK 、部署平台&#xff0c;模型库等等。 2. AI 框架层面&#xff0c;此层…

【C语言】 程序员的自我修养之(程序编译过程)

在ANSI C(标准C)的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境&#xff0c;它用于实际执行代码。 今天我们就讲解他们在这环境过程都做了什么。 文章目录详解编译链接翻译环境编…

【数据库原理 • 七】数据库并发控制

前言 数据库技术是计算机科学技术中发展最快&#xff0c;应用最广的技术之一&#xff0c;它是专门研究如何科学的组织和存储数据&#xff0c;如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进&#xff0c;最常用的技术。 当前…

【19】核心易中期刊推荐——人工智能 | 遥感信息处理

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

redis——优化

键值设计bigKey例子批处理单机 pipeline集群服务器持久化慢查询安全内存集群问题集群完整性集群带宽数据倾斜客户端性能命令的集群兼容性lua和事务&#xff1a;集群下不支持键值设计 长度 < 44 节省内存。string的底层数据结构中&#xff0c;编码格式embstr&#xff08;连续…

LeetCode:455. 分发饼干——贪心算法

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 贪心算法是在每个阶段选取局部最优解&#xff0c;最终得到全局最优解的一种思想。贪心算法…

操作系统论文导读(四):Minimizing Memory Utilization of Real-Time Task Sets in Single and…

目录 一、论文核心思想&#xff1a; 二、降低RAM的思想 三、基本的相关定义 四、单处理器方面 五、优化单处理器中的堆栈使用 六、多处理器方面 七、基本的相关调度 八、协议特点 Minimizing Memory Utilization of Real-Time Task Sets in Single and Multi-Processor…

算法记录 | Day29 回溯算法

491.递增子序列 思路&#xff1a; 1.确定回溯函数参数&#xff1a;定义全局遍历存放res集合和单个path&#xff0c;还需要 nums数组startindex&#xff08;int&#xff09;为下一层for循环搜索的起始位置。 2.终止条件&#xff1a;当startindex >len(nums)&#xff0c;r…

C++初阶—vector深度剖析及模拟实现

目录 ➡️0. 前言 &#x1f60a;1.简易框架实现 &#x1f414;1. 无参构造 &#x1f414;2. 容量capacity — 长度size() &#x1f414;3. 动态增长 — push_back—pop_back — reserve &#x1f414;4. 迭代器的实现 &#x1f414;4.front和back的实现 &#x1f60a;2…

你知道C语言的typedef关键字吗?

本篇博客主要讲解C语言中的typedef关键字。typedef的作用是类型重定义&#xff0c;可以理解为给类型起一个别名。我主要从3个方面来讲解&#xff1a; typedef内置类型。typedef自定义类型。typedef和#define的区别。 1.typedef内置类型 typedef可以给一个类型起“别名”。比如…

服务器部署前后端分离项目

服务器部署前后端分离项目 目录服务器部署前后端分离项目一、安装环境安装jdk1、在/usr/local目录下创建jdk文件夹&#xff0c;并将jdk安装包放到/usr/local/jdk包下并解压1.1通过文件传输工具将jdk包上传到服务器上1.2输入解压命令1.3解压完成&#xff0c;生成下面的文件2、配…

学习周报4/9

文章目录前言文献阅读摘要简介方法结论时间序列预测总结前言 本周阅读文献《Improving LSTM hydrological modeling with spatiotemporal deep learning and multi-task learning: A case study of three mountainous areas on the Tibetan Plateau》&#xff0c;文章主要基于…

多种方法解决SLF4J: Defaulting to no-operation (NOP) logger implementation的错误

文章目录1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法1. 复现错误 今天在编写使用Quartz执行定时任务的方法&#xff0c;如下代码所示&#xff1a; public class QuartzTest {public static void main(String[] args) throws SchedulerException {// 1、创建Sch…

大数据系列——Hive理论

概述 Hive是一个数据仓库管理工具&#xff0c;将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL&#xff08;HQL&#xff09;查询功能。由Facebook实现并开源,最后捐赠给Apache发展为顶级项目。 以RDBMS数据库为元数据存储服务&#xff0c; 以Hadoop HDFS来存储…

44.节流与防抖

目录 1 防抖 1.1 概念 1.2 应用场景 1.3 lodash防抖 1.4 手写防抖 2 节流 2.1 概念 2.2 应用场景 2.3 lodash节流 2.4 手写节流 2.5 记录视频上一次的播放位置 1 防抖 1.1 概念 防抖就是让事件触发后延迟n秒后再执行回调函数&#xff0c;在这n秒内如…

014:Mapbox GL添加draw组件,绘制点、线、多边形、删除

第014个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制点、线、多边形,删除所选元素。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共78行)相关API参考:专栏目标示例效果 配置方…

用于平抑可再生能源功率波动的储能电站建模及评价(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…