归并排序(一)

c语言版本:

cpp 复制代码
void MergeSort(int* array, int n)
{
	int* temp = (int*)malloc(sizeof(int) * n);
	if (NULL == temp)
	{
		assert(0);
		printf("fail\n");
	}
	_MergeSort(array, 0, n, temp);
}

void _MergeSort(int array[], int left, int right, int *temp)
{
	// 如果区间元素个数小于一个即不进行排序
	if (right - left <= 1)
		return;
	// 将数组分为左右俩个区间
	int mid = left + ((right - left) >> 1);
 
	// 递归遍历左右区间
	_MergeSort(array, left, mid, temp);
	_MergeSort(array, mid, right, temp);
 
	// 将左右区间元素进行归并
	MergeData(array, left, mid, right, temp);
	// 将辅助空间中的元素拷贝到原空间
	memcpy(array + left, temp + left, (right - left) * sizeof(int));
}

void MergeData(int array[], int left, int mid, int right, int* temp)
{
	int begin1 = left;
	int end1 = mid;
 
	int begin2 = mid;
	int end2 = right;
 
	// 数组的合并
	int index = left;
	while (begin1 < end1 && begin2 < end2)
	{
		if (array[begin1] <= array[begin2])
			temp[left++] = array[begin1++];
		else
			temp[left++] = array[begin2++];
	}
	while(begin1<end1)
		temp[left++] = array[begin1++];
	while(begin2<end2)
		temp[left++] = array[begin2++];
}

归并排序 二叉树的后序遍历

c++版本

cpp 复制代码
class Solution {
public:
    vector<int> temp; // 全局temp用来还原数组
    void mergesort(int left, int right, vector<int>& nums)
    {
        if(left >= right) return; 
        int mid = left + ((right-left)>>1);
        mergesort(left, mid, nums);  // 合并【left,mid】
        mergesort(mid+1, right, nums); // 合并【mid+1,right】

        mergedata(left, mid, right, nums); // 合并数据
    }
    void mergedata(int left, int mid, int right, vector<int>& nums)
    {
        // 将left到mid 和 mid+1到right进行有序数组的合并
        int cur1 = left, cur2 = mid+1;
        int small = left;
        while(cur1 <= mid && cur2 <= right)
            temp[small++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
        // 处理没有访问到最后边界部分
        while(cur1 <= mid) 
            temp[small++] = nums[cur1++];
        while(cur2 <= right) 
            temp[small++] = nums[cur2++];
        // 将temp还原到nums  也可以直接返回temp
        for(int i = left; i <= right; i++)
            nums[i] = temp[i];
    }
    vector<int> sortArray(vector<int>& nums) {
        temp.resize(nums.size());
        mergesort(0, nums.size()-1, nums);
        return nums;
    }
};
相关推荐
海绵宝宝转agent5 分钟前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼27 分钟前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘28 分钟前
数据结构番外:环形队列
数据结构·c
hahaha601630 分钟前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
海绵宝宝转agent32 分钟前
基于Redis ZSet+AOP+注解实现限流注解算法
数据库·redis·算法
50万马克的面包1 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表
All for pursuit.1 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青1 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq1 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq2 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询