算法基础 1.2 归并排序

归并排序与快速排序类似,也是基于分治思想

快排基于一个数划分边界,归并将中间点作为分界。

1 找分界点(中间值mid = (l + r) / 2)

2 递归排序左右两边

3 归并,合二为一(将两个有序的左右两边合二为一,难点)

class Solution {
public:
	vector<int> tmp;
    void merge_sort(vector<int>& nums, int l, int r)
    {
        if (l >= r) return; 
        int mid = (l + r) >> 1;
        merge_sort(nums, l, mid), merge_sort(nums, mid + 1, r);
        int k = 0, i = l, 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 ++ ];

        for (i = l, j = 0; i <= r; i ++, j++ ) nums[i] = tmp[j];
    }
    vector<int> sortArray(vector<int>& nums) {
        tmp.resize((int)nums.size(), 0);
        merge_sort(nums, 0, nums.size() - 1);
        return nums;
    }
};

你可能感兴趣的:(牛客刷题,力扣,算法笔记,算法,数据结构)