每日一练:归并-排序数组

912. 排序数组 - 力扣(LeetCode)

题目要求:

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1:

复制代码
输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

复制代码
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • 1 <= nums.length <= 5 * 10^4
  • -5 * 104 <= nums[i] <= 5 * 10^4

归并排序 O(NLogN):

归并排序的思路就是将一个数组分成左右两个数组,将左右两个数组分别排序好之后,将这两个有序数组再次进行排序即可。

cpp 复制代码
class Solution {
    vector<int> tmp; // 辅助数组

    void _sortArray(vector<int>& nums, int sta, int end) {
        if (sta == end)
            return;
        // 1、选择中间点划分数组
        int mid = sta + (end - sta) / 2;

        // 2、排序左右区间数组
        _sortArray(nums, sta, mid);
        _sortArray(nums, mid + 1, end);

        // 3、排序的核心过程
        int i = sta, j = mid+1, z = 0;
        while (i <= mid && j <= end) {
            if (nums[i] < nums[j])
                tmp[z++] = nums[i++];
            else
                tmp[z++] = nums[j++];
        }
        while (i <= mid)
            tmp[z++] = nums[i++];
        while (j <= end)
            tmp[z++] = nums[j++];

        // 4、把排序好的结果复制到数组中
        for (int i = sta; i <= end; i++)
            nums[i] = tmp[i - sta];
    }

public:
    vector<int> sortArray(vector<int>& nums) {
        tmp.resize(nums.size());
        _sortArray(nums, 0, nums.size() - 1);
        return nums;
    }
};
相关推荐
森G5 分钟前
35、事件传递模式---------事件系统
c++·qt
故事和你919 分钟前
蓝桥杯-2025年C++B组国赛
开发语言·软件测试·数据结构·c++·算法·职场和发展·蓝桥杯
py有趣15 分钟前
力扣热门100题之合并区间
算法·leetcode
派大星~课堂17 分钟前
【力扣-138. 随机链表的复制 ✨】Python笔记
python·leetcode·链表
cpp_250122 分钟前
P10108 [GESP202312 六级] 闯关游戏
数据结构·c++·算法·动态规划·题解·洛谷·gesp六级
kvo7f2JTy25 分钟前
吃透Linux/C++系统编程:文件与I/O操作从入门到避坑
java·linux·c++
Lzh编程小栈26 分钟前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
崽崽..27 分钟前
【面经】shared_ptr的线程安全问题
c++
AbandonForce28 分钟前
模拟实现vector
开发语言·c++·算法
少许极端33 分钟前
算法奇妙屋(四十二)-贪心算法学习之路 9
学习·算法·贪心算法