leetcode 912 排序数组(归并排序)

一、问题描述

二、解题思路

整体思路

由于本题需要使得数组进行升序排列,所以我们可以使用归并排序来解决这个问题。

具体思路

归并排序的思路如下:

(1)当left=>right即,区间里面只有1个元素或者没有元素时,表示无需排序,直接return;

(2)首先,寻找数组的中间位置mid=(right+left)>>1,为了防止溢出,我们写成mid=left+(right-left)/2;

(3)然后归并排序left,midmid+1,right两个区间,这里采用递归来实现;

(4)采用双指针来合并两个区间,将合并后的数组放入辅助数组tmp;

(5)还原nums数组,即将tmp中的元素移动到nums中。

三、代码实现

时间复杂度:T(n)=O(nlogn)

空间复杂度:S(n)=O(n)

cpp 复制代码
class Solution {
    vector<int> tmp;
public:
    vector<int> sortArray(vector<int>& nums) {
        tmp.resize(nums.size());
       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-left)/2;//防止溢出
        //2.对左右区间分别进行排序
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);
        //3.归并左右区间(双指针)
        int l=left,r=mid+1,i=0;
        while(l<=mid&&r<=right)
            tmp[i++]=nums[l]<=nums[r]?nums[l++]:nums[r++];
        while(l<=mid) tmp[i++]=nums[l++];
        while(r<=right) tmp[i++]=nums[r++];
        //4.还原
        for(int i=left;i<=right;i++)
            nums[i]=tmp[i-left];
    }
};
相关推荐
她说可以呀4 分钟前
Spring-ai-Rag-多文件格式生成 List<Document>
数据结构·list
乐观勇敢坚强的老彭8 分钟前
计算机内存中的堆和栈
c++
饼饼学习空间智能36 分钟前
遥操作数据能否提升机器人自主化水平?详解模仿学习、仿真放大与Sim2Real闭环
人工智能·算法
间歇性努力持续性发呆的野生快乐选手1 小时前
dfs回溯,bfs枚举,完全背包
c++·算法·深度优先·宽度优先
郝学胜_神的一滴1 小时前
干货版《算法导论》17:双数极值配对与卡牌手牌编码最优解
数据结构·算法
码工许师傅2 小时前
一文读懂《Effective C++ 第三版》的55条黄金法则
c++
ao-weilai2 小时前
C++基础:C++11部分内容
开发语言·c++·c++11
有点。2 小时前
C++深度优先搜索(三)
开发语言·c++·深度优先
nike0good2 小时前
Codeforces Round 1101 (Div. 2) 题解
算法
中年阿甘2 小时前
解析式布局-二次线长布局
线性代数·算法·矩阵