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

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;
    }
};
相关推荐
灵感__idea3 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
lwf0061645 小时前
导数学习日记
学习·算法·机器学习
头发够用的程序员6 小时前
从滑动窗口到矩阵运算:img2col算法基本原理
人工智能·算法·yolo·性能优化·矩阵·边缘计算·jetson
武帝为此6 小时前
【数据清洗缺失值处理】
python·算法·数学建模
Halo_tjn7 小时前
Java 基于字符串相关知识点
java·开发语言·算法
念越7 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
万法若空8 小时前
C++ <memory> 库全方位详解
开发语言·c++
黎阳之光8 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
代码中介商8 小时前
C++ 类型转换深度解析:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
青小莫8 小时前
C++之string(OJ练习)
开发语言·c++·stl