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

【C++算法】47.分治_归并_排序数组

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

912. 排序数组


题目描述:

e509f18102a6d4c931e4adf1ebd47cc7


解法

归并排序

12b6d2c675692a52a133036c7a011bac

快排有点像前序遍历,归并有点像后序遍历。


C++ 算法代码:

class Solution 
{
    vector<int> tmp; // 用于临时存储合并后的数组
    public:
    vector<int> sortArray(vector<int>& nums) 
    {
        tmp.resize(nums.size()); // 初始化临时数组的大小与 nums 相同
        mergeSort(nums, 0, nums.size() - 1); // 调用归并排序函数,从数组的起始位置到末尾位置
        return nums; // 返回排序后的数组
    }
    void mergeSort(vector<int>& nums, int left, int right)
    {
        if(left >= right) return; // 基本情况:如果左边界大于或等于右边界,说明当前区间只有一个元素或为空,无需排序
        // 1. 选择中间点划分区间
        int mid = (left + right) >> 1; // 这里两个加起来不会溢出,使用位运算 (left + right) >> 1 代替 (left + right) / 2 以提高效率
        // [left, mid] [mid + 1, right]为划分后的两个子区间
        // 2. 递归地对左右两个子区间进行排序
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);
        // 3. 合并两个有序的子数组
        // 初始化指针
        // cur1指向第一个子数组的当前元素
        // cur2指向第二个子数组的当前元素
        // i指向临时数组的当前位置
        int cur1 = left, cur2 = mid + 1, i = 0;
        // 当两个子数组都还有元素时,比较并复制较小的元素到临时数组
        while(cur1 <= mid && cur2 <= right)
            tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++]; // 如果第一个子数组的当前元素小于或等于第二个子数组的当前元素
        // 处理没有遍历完的数组
        while(cur1 <= mid) tmp[i++] = nums[cur1++]; // 处理第一个子数组中剩余的元素(如果有)
        while(cur2 <= right) tmp[i++] = nums[cur2++]; // 处理第二个子数组中剩余的元素(如果有)
        // 4. 将临时数组中的合并结果复制回原数组的对应位置
        for(int i = left; i <= right; i++)
            nums[i] = tmp[i - left];
        //tmp[i - left] 是因为 tmp 是从索引 0 开始存储合并后的结果,而 nums 的索引是从 left 开始。
        //因此,tmp 的第 0 个元素对应 nums 的第 left 个元素,tmp 的第 1 个元素对应 nums 的第 left + 1 个元素,依此类推
    }
};

http://www.kler.cn/a/443921.html

相关文章:

  • Azure虚拟机非托管磁盘大小调整
  • 半连接转内连接规则的原理与代码解析 |OceanBase查询优化
  • 【使用MCP协议连接本地和远程数据——以Claude的Windows客户端为例】
  • 武汉市电子信息与通信工程职称公示了
  • 将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?
  • [python]使用flask-caching缓存数据
  • 云原生周刊:Kubernetes v1.32 正式发布
  • apache应用(客户机地址限制、用户授权限制、日志分割、AWStats日志分析)
  • 【Apache Paimon】-- 10 -- Paimon 0.9.0 集成 Hive 3.1.3
  • python学习 洛谷P2141 [NOIP2014 普及组] 珠心算测验
  • Java操作Redis-Jedis
  • 高德地图离线加载解决方案(内网部署)+本地地图瓦片加载
  • []2024年第五届蓝桥杯全国软件和信息技术专业人才大赛(Web 应用开发)
  • c++中如何保持结构体的线程安全?3D坐标的线程安全:从理论到最优解
  • 【myXdb.stop()关闭时保存数据流程分析】xdb关服时数据落地源码
  • 基于阿里云日志服务的程序优化策略与实践
  • 关于目标检测YOLO 各版本区别v1-v11/X/R/P
  • go语言并发读写数据队列,不停写的同时,一次最多读取指定量数据(逐行注释)
  • 【自动驾驶】Ubuntu20.04安装ROS1 Noetic
  • 在C#中,可以通过使用委托(delegate)或者是事件(event)来将方法作为参数传递。
  • Redis篇-14--数据结构篇6--Set内存模型(整数集合intset,哈希表hashtable)
  • 爬虫可能会遇到哪些反爬措施?
  • 【AI热点】小型语言模型(SLM)的崛起:如何在AI时代中找到你的“左膀右臂”?
  • 在 Go 中利用 ffmpeg 进行视频和音频处理
  • Java web概述
  • v-html详细解析与代码实例