归并排序(C++)

归并排序

基本思想是把待排序的元素分解成两个规模大致相等的子序列,如果不易分解,将得到的子序列继续分解,直到子序列中包含的元素个数为1。

时空复杂度和稳定性

时间复杂度

O ( n l o g n ) O(nlogn) O(nlogn)

空间复杂度

归并的空间复杂度就是临时数组和递归时压入栈的数据占用的空间n+logn,所以空间复杂度是
O ( n ) O(n) O(n)

稳定性

归并排序是稳定的。合并过程中可以保证如果两个当前元素相等时,把处于前面的序列的元素保存在结果序列前面,这样就保证了稳定性。

代码

class Solution {
    
    
private:
    vector<int> tmp;
    void mergeSort(vector<int>& nums, int begin, int end) {
    
    
        if (begin>=end) return;
        int mid=(begin+end)/2;
        mergeSort(nums,begin,mid);
        mergeSort(nums,mid+1,end);

        int i = begin, j = mid + 1;
        int cnt = 0;
        while (i <= mid && j <= end) {
    
    
            if (nums[i] <= nums[j]) {
    
    
                tmp[cnt++] = nums[i++];
            }
            else {
    
    
                tmp[cnt++] = nums[j++];
            }
        }
        while (i <= mid) {
    
    
            tmp[cnt++] = nums[i++];
        }
        while (j <= end) {
    
    
            tmp[cnt++] = nums[j++];
        }
        for (int i = 0; i < end-begin + 1; ++i) {
    
    
            nums[i + begin] = tmp[i];
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
    
    
         tmp.resize((int)nums.size(), 0);
        mergeSort(nums,0,nums.size()-1);
        return nums;
    }
};

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qaaaaaaz/article/details/130128688