归并排序怎么写,看这里( MergeSort 和 _MergeSort )

本文详细介绍了归并排序算法,包括其工作原理、如何通过_MergeSort函数实现分治策略,以及时间复杂度和空间复杂度的分析。重点讲解了如何使用辅助数组tmp进行合并操作,以及在main函数中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//归并排序是将两个已经排好序的数列,以某一种顺序整合在一起的排序算法
//前提是要有两个已经排好序的数列!
//归并排序的时间复杂度是 O(logN*N),并且还有O(n)的空间复杂度


   //_MergeSort是MergeSort函数的一个子函数,通过不断地分治到单独的数上
   //来为归并算法提供前提,使要归并的两个数列有序
   //通过_MergeSort函数反复的递归调用来实现将一个无序的数列排好序
 
//tmp开辟出来的空间的作用是:
//将排好序的数列放到tmp开辟的空间中,然后再将tmp空间里的数列放到原数组中
//实现了一个替换的作用
void _MergeSort(int *arr, int left, int right,int* tmp)
{
	
	if (left == right)
		return;
   //每次将数列进行取一半来分治,当分治到一个数时,返回
	int mid = left + ((right - left) >> 1);


	_MergeSort(arr, left, mid,tmp);//左半区间进行归并
	_MergeSort(arr, mid + 1, right,tmp);//右半区间进行归并


	int begin1 = left; int end1 = mid;
	int begin2 = mid+1;  int end2 = right;

	int i = begin1;
	while (begin1 <= end1&&begin2 <= end2) //注意是&&
	{
       //分别从左右两个半数列的第一个位置进行比较
		if (arr[begin1] > arr[begin2])
		{
    
			tmp[i++] = arr[begin2++];


		}

		else{

			tmp[i++] = arr[begin1++];

		}
	}
//跳出循环后,若还有没有比较的数列,则依次排在后面
	while (begin1 <= end1)
	{

		tmp[i++] = arr[begin1++];


	}

	while (begin2 <=end2)
	{

	 tmp[i++] = arr[begin2++];

	}

	int j = left;
	while (j<= right)
	{ 
	 //将tmp空间里的数列赋值到原数组中


		arr[j] = tmp[j];
		++j;

	}

}


void MergeSort(int *arr, int n)
{
  //在堆上开辟整个数列大小的空间
	int *tmp = (int*)malloc(sizeof(int)*n);
	_MergeSort(arr, 0, n - 1,tmp);
	free(tmp);

}

void PrintArray(int *arr, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{

	int arr[] = { 9, 1, 8, 2, 7, 3, 6, 4, 5 };
	MergeSort(arr,sizeof(arr) / sizeof(arr[0]));
	PrintArray(arr, sizeof(arr) / sizeof(arr[0]));

	return 0;

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值