C++ 归并排序

#include <iostream>
#include <vector>
using namespace std;

/// 合并
void merge(vector<int>& nums, int l1, int r1, int l2, int r2, vector<int>& tmp) {
	int left = l1, right = r2;
    int k = l1;
    while(l1<=r1 && l2<=r2) {
        while (nums[l1] < nums[l2] && l1 <= r1) {
            tmp[k++] = nums[l1++];
        }

        while (nums[l1] >= nums[l2] && l2 <= r2) {
            tmp[k++] = nums[l2++];
        }
    } 

    while (l1 <= r1) {
        tmp[k++] = nums[l1++];
    }

    while (l2 <= r2) {
        tmp[k++] = nums[l2++];
    }
	
	for (int i=left; i<= right; ++i) {
		nums[i] = tmp[i];
	}
}

/// 拆分
void mergesort(vector<int>& nums, int l, int r, vector<int>& tmp) {
    if (l == r) {
        return ;
    }

    mergesort(nums, l, (l+r)/2, tmp);
    mergesort(nums, (l+r)/2+1, r, tmp);

    merge(nums, l, (l+r)/2, (l+r)/2+1, r, tmp);
}

/// 归并入口
void mergesort(vector<int>& nums) {
    int n = nums.size();
    if (n < 2) {
        return ;
    }
    vector<int> tmp(n);
    
    mergesort(nums, 0, n-1, tmp);

}


int main()
{
   vector<int> nums = {2, 3, 1, 9, 7, 8, 6, 4, 5};
	mergesort(nums);
	
	for (auto &ele : nums) {
		cout << ele << endl;
	}
	return 0;
}
maxq top = 2
minq top = 1
posted @   小海哥哥de  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2021-09-08 C++ 内存写坏排查
2020-09-08 C++11 智能指针
2020-09-08 xargs 命令使用
点击右上角即可分享
微信分享提示