【数据结构】归并排序

cpp 复制代码
#include<iostream>

using namespace std;


void Merge(int* arr,int left,int right,int mid, int*& tmparr)
{
	
	
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int tmpi = left;

	//下面合并两个数组为一个有序数组(升序);
	while (begin1<=end1&&begin2<=end2)
	{
		if (arr[begin1] < arr[begin2])
		{
			tmparr[tmpi++] = arr[begin1++];
		}

		else if (arr[begin1] >= arr[begin2])
		{

			tmparr[tmpi++] = arr[begin2++];
		}

	}

	while (begin1<=end1)
	{
		tmparr[tmpi++] = arr[begin1++];
	}

	while (begin2 <= end2)
	{

		tmparr[tmpi++] = arr[begin2++];
	}

	//每次子数组排序好都必须拷贝到原数组,使原数组越来越接近有序。如果被分割的子数组都不有序,那么合并成的大数组也一定不会有序。
	memcpy(arr+left, tmparr+left, sizeof(int)*(right-left+1));
}

//时间复杂度O(N*logN),空间复杂度O(N);
void Merge_Sort(int* arr,int left,int right,int*& tmparr)
{
	if (left >= right) return;
	int mid = (left + right) / 2;
	Merge_Sort(arr,left,mid,tmparr);
	Merge_Sort(arr, mid+1, right,tmparr);

	Merge(arr,left,right,mid,tmparr);
}


int main()
{
	int arr[] = {66,72,53,41,38,39,25,40,90};
	int size = sizeof(arr) / sizeof(int);
	int* tmparr = new int[size];
	//构建一个一模一样一样的数组,这也就是空间复杂度O(N)的原因;
	Merge_Sort(arr,0,size-1,tmparr);

	
	delete []tmparr;
	for (auto& e:arr)
	{
		cout<<e<<" ";
	}
	return 0;
}
相关推荐
TracyCoder12311 分钟前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九19 分钟前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈27 分钟前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
子春一37 分钟前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏
草履虫建模7 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq9 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq9 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq10 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)11 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi11 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划