数据结构———归并排序

本文深入讲解了归并排序的基本思想及其实现过程,包括如何通过递归将数据均分为两部分,直至每个子数组仅含一个元素,再将这些有序子数组合并成一个大数组。文章还探讨了归并排序的稳定性、时间与空间复杂度,以及其在磁盘外部排序问题上的应用。

归并排序的基本思想:
 归并排序与快速排序比较类似,都是对数据进行划分,但与快速排序不同的是归并排序是将数据均分为左右两部分,左右两半部分继续进行划分直到划分为一个数组中只有一个元素,这个数组在它所在部分为有序,然后将左右两个有序数组归并为一个有序数组。

 MergeData()函数实现将两个有序数组归并为一个有序数组

原理:借助辅助空间,将两个数组里的数据搬移到tmep中

void MergeData(int* array,int left,int right,int mid,int* temp)//将两组有序的数组归并为一个有序的数组
{
	int begin1 = left,end1 = mid;
	int begin2 = mid,end2 = right;
	int index = left; //索引 元素放在temp的位置
	while(begin1 < end1 && begin2 < end2)
	{
		if(array[begin1] <= array[begin2])
			temp[index++] = array[begin1++];
		else
			temp[index++] = array[begin2++];
	
	}//循环结束后一个数组的值已经搬运完成
	while(begin1 < end1)
	{
	 temp[index++] = array[begin1++];
	}
	while(begin2 < end2)
	{
	temp[index++] = array[begin2++];
	}
}

 MergeSort()归并排序函数

//将数据均分为两部分,对左右两半部分继续进行划分直到划分为数组中只有一个数据 过程是递归的 
//在划分完成后 对两个有序数组进行归并  过程是递归的 递归结束后数据有序 
void _MergeSort(int* array,int left,int right,int *temp)
{
	   int mid = 0;
	if(right - left > 1)
	{
		 //mid = left + ((right - left)>>1);
		 mid = (right + left) >>1;
		_MergeSort(array,left,mid,temp);
		_MergeSort(array,mid,right,temp);
		MergeData(array,left,right,mid,temp);

		memcpy(array+left,temp+left,sizeof(array[0])*(right - left));将temp中的数据复制到array中
	
	}
}
void MergeSort(int* array,int size)//对_MergeSort()封装
{
	int* temp = (int*)malloc(sizeof(array[0])*size);
	if(NULL == temp)
	{
		assert(0);
		return;
	}
	_MergeSort(array,0,size,temp);
	
	free(temp);
}

 归并排序的特性总结:

稳定性: 稳定

时间复杂度 : O(Nlong2^N)

空间复杂度:  O(N)

应用:解决在磁盘中的外部排序问题

缺点:归并的缺点在于需要O(N)的空间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值