【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(69)

1. 题目解析

题目链接:912. 排序数组

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

归并排序(Merge Sort)是一种采用"分而治之"(Divide and Conquer)策略的高效排序算法。其基本思想是将一个待排序的数组拆分成若干个小的子数组,直到每个子数组只包含一个元素(此时可以认为子数组是有序的),然后再将这些有序的子数组合并成一个大的有序数组,直到合并为最初的数组长度。

算法流程

归并排序的主要流程可以分解为以下两个步骤:

1. 分解(Divide)
  • 将待排序的数组从中间位置分成两个大小相近的子数组,直到每个子数组只包含一个元素为止。
  • 这个过程是一个递归过程,通过不断地将数组一分为二,实现对待排序数组的分解。
2. 递归合并(Conquer and Combine)
  • 从最底层开始,将相邻的两个有序子数组合并成一个新的有序数组,直到合并为最初的数组长度。
  • 在合并的过程中,为了保证合并后的数组有序,需要比较两个子数组中的元素,将较小的元素依次放入新的数组中。
算法实现细节
  • 递归基准:当子数组的长度为1时,认为该子数组已经有序,无需继续分解。
  • 合并操作:合并两个有序子数组时,需要创建一个新的数组来存储合并后的结果。通过比较两个子数组中的元素,将较小的元素依次放入新数组中,直到其中一个子数组的所有元素都被放入新数组。然后将另一个子数组中剩余的元素依次放入新数组,确保合并后的数组有序。
  • 空间复杂度:归并排序的空间复杂度为O(n),其中n为数组的长度。这是因为在合并过程中需要创建一个新的数组来存储合并后的结果。然而,在实际应用中,可以通过一些技巧(如使用原地归并排序)来减少空间复杂度。
  • 时间复杂度:归并排序的时间复杂度为O(nlogn),其中n为数组的长度。这是因为每次递归分解都将数组长度减半,而合并操作的时间复杂度为O(n)。因此,总的时间复杂度为O(nlogn)。

3.代码编写

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;

        int mid = (right + left) >> 1;
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);

        int cur1 = left, cur2 = mid + 1, i = 0;
        while(cur1 <= mid && cur2 <= right)
            tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
        while(cur1 <= mid) tmp[i++] = nums[cur1++];
        while(cur2 <= right) tmp[i++] = nums[cur2++];
        for(i = left; i <= right; i++)
            nums[i] = tmp[i - left];
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

相关推荐
To_OC6 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与11 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
博客180014 小时前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴16 小时前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
复杂网络16 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法