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

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;
    }
};
相关推荐
编啊编程啊程3 小时前
JUC之AQS
java·开发语言·jvm·c++·kafka
2501_924889555 小时前
商超高峰客流统计误差↓75%!陌讯多模态融合算法在智慧零售的实战解析
大数据·人工智能·算法·计算机视觉·零售
jingfeng5146 小时前
C++模板进阶
java·c++·算法
头发掉光的程序员6 小时前
第七章 利用Direct3D绘制几何体
c++·windows·图形渲染·direct12
地平线开发者6 小时前
征程 6X | 常用工具介绍
算法·自动驾驶
地平线开发者7 小时前
理想汽车智驾方案介绍 2|MindVLA 方案详解
算法·自动驾驶
艾莉丝努力练剑7 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
地平线开发者7 小时前
LLM 中评价指标与训练概要介绍
算法·自动驾驶
Ghost-Face8 小时前
关于并查集
算法
flashlight_hi9 小时前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode