高级排序算法:归并排序(优化版)

题目描述

leecode第912题:排序数组:

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

示例 1:

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

示例 2:

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

提示:

cpp 复制代码
1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104

代码:

cpp 复制代码
//归并排序优化
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int len = nums.size();

        //优化1:全局使用一份临时数组
        int *temp = new int[len];
        mergeSort(nums, 0, len - 1, temp);
        return nums;
    }

    void mergeSort(vector<int>& nums, int left, int right, int* temp){
        if(right == left){
            return;
        }
        int mid = left + (right - left)/2;
        
        mergeSort(nums, left, mid, temp);
        mergeSort(nums, mid + 1, right, temp);
        //优化2:在两部分数组已经有序的情况下,不再合并
        if(nums[mid] < nums[mid+1]){
            return;
        }
        mergeOfTwoSortedArray(nums, left, mid, right, temp);
    }


    void mergeOfTwoSortedArray(vector<int>& nums, int left, int mid, int right, int* temp){
        for(int i = left; i<=right; i++){
            temp[i] = nums[i];
        }

        int i = left, j = mid + 1;
        for(int k = left; k<=right; k++){
            if(i == mid+1){
                nums[k] = temp[j];
                j++;
            }
            else if(j == right + 1){
                nums[k] = temp[i];
                i++;
            }

            else if(temp[i] <= temp[j]){//这一行的else没写曾经耗费了很长时间排查
                nums[k] = temp[i];
                i++;
            }
            else if(temp[i] > temp[j]){
                nums[k] = temp[j];
                j++;
            }
        }
    }
};
相关推荐
努力写代码的熊大14 分钟前
链式二叉树数据结构(递归)
数据结构
yi.Ist15 分钟前
数据结构 —— 键值对 map
数据结构·算法
爱学习的小邓同学15 分钟前
数据结构 --- 队列
c语言·数据结构
s1533517 分钟前
数据结构-顺序表-猜数字
数据结构·算法·leetcode
闻缺陷则喜何志丹18 分钟前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找
Coding小公仔20 分钟前
LeetCode 8. 字符串转换整数 (atoi)
算法·leetcode·职场和发展
GEEK零零七26 分钟前
Leetcode 393. UTF-8 编码验证
算法·leetcode·职场和发展·二进制运算
DoraBigHead1 小时前
小哆啦解题记——异位词界的社交网络
算法
木头左3 小时前
逻辑回归的Python实现与优化
python·算法·逻辑回归
lifallen7 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree