归并排序分析

归并排序是分治法的有效应用,算法步骤是:
1.通过递归拆分数组
2.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
3.设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。
在这里插入图片描述
例题:leetcode 215
数组中的第K个最大元素
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

int tmp[1000000] = { 0 };
class Solution {
public:
    void sort_merge(vector<int>& nums, int l, int r) {
        if (l >= r) {
            return;
        }
        int mid = (l + r) / 2;
        //1.分割
        sort_merge(nums, l, mid);
        sort_merge(nums, mid + 1, r);
        //2.合并,需要开辟额外空间
        int k = 0; int i = l; int j = mid + 1;
        while (i <= mid && j <= r)
        {
            if (nums[i] <= nums[j])
            {
                tmp[k++] = nums[i++];
            }
            else {
                tmp[k++] = nums[j++];
            }
        }
        while (i <= mid) tmp[k++] = nums[i++];
        while (j <= r) tmp[k++] = nums[j++];
        //将临时数组中的数组拷回nums
        for (int k = 0, t = l; k < r - l + 1; k++)
        {
            nums[t++] = tmp[k];
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值