分治算法--归并排序

一.基本思想与步骤

归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。直观上其操作如下:

Merge-Sort

——Divide-and-Conquer(P)

1.   如果子序列长度为1,排序完成。

—— if |P|≤n0 thenreturn(ADHOC(P))

2.   分解待排序的n个元素的序列成各具n/2个元素的子序列。

——将P分解为较小的子问题 P1 ,P2,...,Pk

3.    递归排序两个子序列。

——for i←1 to kdo yi ←Divide-and-Conquer(Pi)递归解决Pi

4.    合并两个已排序的子序列以产生已排序的答案。

——T ← MERGE(y1,y2,...,yk)合并子问题, return(T)

当待排序的序列长度为1时,即已牌号序,递归“开始回升”,不做任何操作。

    归并排序的关键在于MERGE合并已排序子序列,类如玩扑克牌,假设桌面上有已经排好序的两堆扑克牌,如何合并成单一有序输出堆。算法导论实现伪代码如下:

MERGE(A,p,mid,r)
n1 = mid – p + 1, n2 = r – mid;
Let L[1…n1] and R[1…n2] be new arrays;
For i = 1 to n1 
	L[i] = A [p+i-1];
For i = 1 to n2 
R[i] = A [mid+i];
L[n1+1] = R[n2+1] = MAX;
i = 1 , j =1;
For( k = p to r
	If L[i] < R[j] 
		A[k] = L[i++];
	Else 
		A[k] = R[j++];
 现在将MERGE作为一个子程序应用。下面MERGE-SORT(A,p,r)排序A[p..r]中元素,若p>=r,则子数组最多一个元素,即已经划分完成,且已排序完成。否则,分解成A[p..mid]A[mid+1..r]两个子数组,递归调用MERGE-SORT。伪代码如下:
MERGE-SORT(A,p,r)
If(p<r)
	Mid = (p+r)/2;
	MERGE-SORT(A,p,mid);
	MERGE-SORT(A,mid+1,r);
	MERGE(A,p,mid,r);
#include<stdio.h>
#define MAX 0x3f3f3f

void Merge(int a[],int l,int m,int u)
{
	int i,j=0,k=0;
	int *b=new int[m-l+1];
	int *c=new int[u-m];
	for(i=0;i<m-l+1;i++)
		b[i]=a[l+i-1];
	b[i]=MAX;
	for(i=0;i<u-m;i++)
		c[i]=a[m+i];
	c[i]=MAX;

	for(i=l-1;i<u;i++)
	{
		if(b[j]<=c[k])
			a[i]=b[j++];
		else 
			a[i]=c[k++];
	}
	/*
	puts("test");
	for(i=l-1;i<u;i++)
		printf("%d ",a[i]);	
	puts("");
	*/
}

void Mergesort(int a[],int begin,int end)
{
	int mid=(begin+end)/2;
	if(begin<end)
	{
		Mergesort(a,begin,mid);
		Mergesort(a,mid+1,end);
		Merge(a,begin,mid,end);
	}

}

int main()
{
	int a[20];
	int i;
	for(i=0;i<20;i++)
		scanf("%d",&a[i]);
	Mergesort(a,1,20);
	for(i=0;i<20;i++)
		printf("%d ",a[i]);
	puts("");
	return 0;
}

二.复杂度分析

时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。 空间复杂度 为 O(n)。 比较操作的次数介于(nlogn) / 2和nlogn - n + 1。 赋值操作的次数是(2nlogn)。归并算法的空间复杂度为:0 (n)。 归并 排序 比较占用内存,但却是一种效率高且稳定的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值