算法日常・每日刷题--<归并排序>1

912. 排序数组 - 力扣(LeetCode)912. 排序数组 - 给你一个整数数组 nums,请你将该数组升序排列。你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1:输入:nums = 5,2,3,1输出:1,2,3,5解释:数组排序后,某些数字的位置没有改变(例如,2 和 3),而其他数字的位置发生了改变(例如,1 和 5)。示例 2:输入:nums = 5,1,1,2,0,0输出:0,0,1,1,2,5解释:请注意,nums 的值不一定唯一。 提示: * 1 <= nums.length <= 5 * 104 * -5 * 104 <= numsi <= 5 * 104https://leetcode.cn/problems/sort-an-array/description/

归并排序

一、核心思想

分治思想

  1. :把待排序数组不断对半拆分,直到每个子序列只有1 个元素(天然有序);
  2. 治(归并):将两个有序子数组合并成一个更大的有序数组;
  3. 递归重复,最终合并得到完整有序数组。

一句话总结:先拆分,分到最小单元,再两两有序合并。

cpp 复制代码
                [38,27,43,3,9,82,10]
         [38,27,43]        [3,9,82,10]
     [38,27]    [43]    [3,9]    [82,10]
   [38] [27]             [3][9]  [82][10]
cpp 复制代码
[38][27] → [27,38]
[27,38] + [43] → [27,38,43]

[3][9] → [3,9]
[82][10] → [10,82]
[3,9] + [10,82] → [3,9,10,82]

[27,38,43] + [3,9,10,82] → [3,9,10,27,38,43,82]

很像是二叉树的后序遍历

而快排则是像二叉树的前序遍历

题目描述

题目要求:给你一个整数数组 nums,请你将该数组升序排列。你必须在不使用任何内置排序函数的情况下解决问题,时间复杂度要求 \(O(n\log n)\),空间复杂度尽可能小。

关键:合并两个有序数组

合并逻辑是归并排序最重要的模块: 输入两段有序区间 [l, mid][mid+1, r]

  1. 开辟临时数组存放合并结果;
  2. 双指针分别指向两段有序区间起点;
  3. 比较两个指针指向元素,把更小的值放入临时数组,对应指针后移;
  4. 其中一段遍历完成后,直接追加另一段剩余元素;
  5. 将临时有序数组覆盖回原数组对应区间。
cpp 复制代码
class Solution {
public:
   vector<int> temp;
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        temp.resize(n);
        mergesort(nums,0,n-1);
        return nums;
    }
 

        void mergesort(vector<int>& nums,int left,int right)
        {
            if(left >= right) return;
            int mid=(left+right)/2;
            mergesort(nums,left,mid);
            mergesort(nums,mid+1,right);

           int cur1=left,cur2=mid+1,i=0;
           while(cur1<=mid&&cur2<=right)
           temp[i++]=nums[cur1]<nums[cur2]?nums[cur1++]:nums[cur2++];
           while(cur1<=mid)
           temp[i++]=nums[cur1++];
           while(cur2<=right)
           temp[i++]=nums[cur2++];

           for(int i=left;i<=right;i++)
           {
            nums[i]=temp[i-left];
           }

        }

};
相关推荐
aramae4 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能5 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
淡海水5 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
INGNIGHT9 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_839080549 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山9 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
暮雨封夕9 小时前
跳表(Skip List)详解:原理、实现、使用场景与实际应用
数据结构
mikuyyds10 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a1879272183110 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历