归并排序

思路:分治思想,通过不断地合并两个有序的数组达到最终的排序结果。需要O(n)的辅助空间,即空间换时间。相较于快速排序的优点在于其稳定。

void merge(vector<int>& nums, int l, int mid, int r) {
    vector<int> tmp(r-l+1);  //开辟辅助空间
    int i = l, j = mid+1, k = 0;
    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 = 0; i < tmp.size(); ++i) {
    nums[l+i] = tmp[i];
}
}

void mergeSort(vector<int>& nums, int l, int r) {
    if(l >= r) return;
    int mid = (l + r) / 2;
    mergeSort(nums, l, mid);
    mergeSort(nums. mid+1, r);
    merge(nums, l, mid, r);
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。