算法日常・每日刷题--<归并排序>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];
           }

        }

};
相关推荐
启观川6 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸6 小时前
排序算法介绍
python·算法·排序算法
动词ing7 小时前
【题目练习】算法 组合总和||
算法
longlongzihan7 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源7 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1018 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0118 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯8 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水9 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB9 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法