排序算法-归并排序

归并排序

函数入口
vector<int> sortArray(vector<int>& nums) {
        if (nums.size() <= 1) {
            return nums;
        }
        vector<int> temp(nums.size());

        mergeSort(nums, 0, nums.size() - 1, temp);
        return nums;
    }
数组分割函数

5 2 3 4 1 分割成 5 2 3 和 4 1
5 2 3还可以继续分割成5 2 和 3
最后整个数组分割成5 2 和 3 和 4 1 三个部分
mergeSort函数只起到分割的作用

    void mergeSort(vector<int>& nums, int start, int end, vector<int>& temp) {
        if (start >= end) {
            return;
        }
        mergeSort(nums, start, (start + end) / 2, temp);
        mergeSort(nums, (start + end) / 2 + 1, end, temp);

        merge(nums, start, end, temp);
    }
合并函数

将nums数组从中间分割成两部分,将分割后的两个数组按照升序排列起来,前提是分割的两部分已经是排好序的了,类似于合并升序链表。

void merge(vector<int>& nums, int start, int end, vector<int>& temp) {
        int mid = (start + end) / 2;
        int left = start, right = mid + 1;
        int index = left;

        while (left <= mid && right <= end) {
            if (nums[left] <= nums[right]) {
                temp[index] = nums[left];
                index++;
                left++;
            }
            else {
                temp[index] = nums[right];
                index++;
                right++;
            }
        }

        while (left <= mid) {
            temp[index] = nums[left];
            index++;
            left++;
        }

        while (right <= end) {
            temp[index] = nums[right];
            index++;
            right++;
        }

        for (int i = start; i <= end; i++) {
            nums[i] = temp[i];
        }

    }
};
记忆方法

1、第一步分割数组,第二步合并两个升序数组,第三步将原数组中乱序数组替换掉
2、注意合并升序数组时,left++,right++,index++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值