[LeetBook]【学习日记】排序算法——归并排序

主要思想

  1. 归并排序是一种分治算法,其排序过程包括分和治
  2. 分是指将要排序的序列一分为二、二分为四,直到单个序列中只有一个数
  3. 治是指在分完后,将每两个元素重新组合,四合为二、二合为一,最终完成排序

    图片作者:Krahets
    链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/p5l0js/

代码框架

cpp 复制代码
void mergeSort(vector<int> nums, int low, int high) {
        if(low>=high) return;//直到序列中只有单个元素
        //分
		...
        //治
		...
        }
    }
  1. 分:也就是一分为二的过程,类似二分查找,使用两个递归一次传入一半的序列
  2. 治:在分完后,新建一个临时数组,将要合并的内容先存储起来,然后使用两个下标从两个要合并的序列的开始处进行遍历比较,依次将正确顺序的元素存入原数组,当有一个下标超出其要遍历的序列时,直接将其他序列剩下的内容合并到原数组的后面

完整代码

cpp 复制代码
在这里插入代码片void mergeSort(vector<int>& nums, int low, int high) {
        if(low>=high) return;
        int mid=(high+low)/2;
        //分
        mergeSort(nums, low, mid);
        mergeSort(nums, mid+1, high);
        //治
        vector<int> temp;
        temp.assign(nums.begin()+low, nums.begin()+high+1);
        int i=0, j=mid-low+1;//用于在 temp 中遍历
        for(int x=low; x<=high; ++x){
            if(i==mid-low+1) nums[x]=temp[j++];
            else if(j==high-low+1 || temp[j]>=temp[i]) nums[x]=temp[i++];
            else nums[x]=temp[j++];
        }
    }

此处的>=保证排序结果稳定。

cpp 复制代码
else if(j==high-low+1 || nums[j]>=nums[i]) nums[x]=temp[i++];

相关题目

148. 排序链表
LCR 170. 交易逆序对的总数

相关推荐
云小逸4 分钟前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
JustDI-CM40 分钟前
AI学习笔记-提示词工程
人工智能·笔记·学习
悟纤41 分钟前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
爱写bug的野原新之助41 分钟前
加密摘要算法MD5、SHA、HMAC:学习笔记
笔记·学习
YuTaoShao44 分钟前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:Web开发框架应用的实现
python·学习·flutter
百锦再1 小时前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose2 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
A9better2 小时前
C++——不一样的I/O工具与名称空间
开发语言·c++·学习
AI职业加油站2 小时前
职业提升之路:我的大数据分析师学习与备考分享
大数据·人工智能·经验分享·学习·职场和发展·数据分析