归并排序

        归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

        归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。


下面是归并排序的C++代码:

//把两个有序序列归并成一个有序序列
void Merge(int array[], int temparray[],int left, int middle, int right){
	int index1=left;
	int index2=middle;
	int leftEnd = middle - 1;
	int tmpPos = left;
	//主循环
	while (index1<=leftEnd&&index2<=right)
	{
		if (array[index1]<=array[index2])
		{
			temparray[tmpPos++] = array[index1++];
		}
		else{
			temparray[tmpPos++] = array[index2++];
		}
	}
	while (index1<=leftEnd) //复制第一部分剩下的
	{
		temparray[tmpPos++] = array[index1++];
	}
	while (index2<=right)  //复制第二部分剩下的
	{
		temparray[tmpPos++] = array[index2++];
	}  
	for (int i = left; i <= right;i++)
	{
		array[i] = temparray[i];  //最后面把值复制过去
	}
}
//归并排序,迭代
void MSort(int array[], int tmpArray[],int left, int right){
	int center;
	if (left < right)
	{
		center = (left + right) / 2;
		MSort(array, tmpArray,left, center);//左边有序
		MSort(array, tmpArray,center + 1, right);//右边有序
		Merge(array, tmpArray,left, center + 1, right);//将两个有序序列合并
	}
}
//归并排序
bool MergeSort(int array[], int n){
	int*tmpArray = new int[n];//新建一个临时数组
	if (tmpArray==NULL)
	{
		return false;
	}
	MSort(array, tmpArray,0, n - 1);
	delete[] tmpArray;
	return true;
}



时间复杂度O(nlogn)

空间复杂度O(n)

稳定性:稳定


用途:速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值