ACM--归并排序与快速排序(递归与分治)

归并排序的内容可在紫书P226里面查看,紫书里的代码写得十分简洁,高效,重点要理解好循坏条件的控制。
快排可参考以下的博客:
https://blog.csdn.net/MoreWindows/article/details/6684558
归并排序时间复杂度:O(nlogn);快排时间复杂度:平均O(nlogn),最慢O(n^2)。
归并排序稳定但占空间比较大,快排占空间较小但不稳定。

以下为代码实现:

#include<cstdio>
using namespace std;
int a[105],T[105];  //T[105]作为临时的辅助空间 
void merge_sort(int x,int y)   //归并排序[x,y) 
{
	if(y-x>1)   //要是***只有一个元素就不用进行一下操作了*** 
	{
		int m=x+(y-x)/2;
		int p=x,q=m;
		int i=x;
		merge_sort(x,m);  //左半部分排序 
		merge_sort(m,y);  //右半部分排序
		while(p<m||p<y)   //***左右两个序列,至少有一个要非空***
		{
			if(q>=y||(p<m&&a[p]<=a[q])) T[i++]=a[p++]; //如果第二个序列为空,此时q>=y,直接复制a[p]就好了,如果第二个序列不为空,且第一个序列也不为空(p<m)
			//若a[p]<=a[q],复制a[p],否则复制a[q];而如果第一个序列为空了,则复制a[q] 
			else T[i++]=a[q++];
		} 
		for(i=x;i<y;i++) a[i]=T[i];  //***从辅助空间复制回a数组*** 
	}
}
void quick_sort(int x,int y) //其实,快排的原理就是逐步找到每个数对应的位置(从小到大或从大到小) 
{
	if(y-x>1)  //***只有一个元素就不用进行一下操作了***
	{
		int i,j;
		int X;
		X=a[x];//printf("%d\n",X);
		for(i=x,j=y-1;i<j;)
		{
			while(i<j&&a[j]>=X)  //***必须先从j开始处理*** 
			    j--;
			if(i<j)
			    a[i++]=a[j];
			while(i<j&&a[i]<X)
			    i++;
			if(i<j)
			    a[j--]=a[i];
		//	printf("%d %d\n",a[i],a[j]);
		}a[i]=X;
		quick_sort(x,i);
		quick_sort(i+1,y);
	}
}
int main()
{
	int n,i;
	//归并排序 
	scanf("%d",&n);
	for(i=0;i<=n-1;i++){
		a[i]=n-i;
		printf("%d ",a[i]);
	}
	printf("\n");
	merge_sort(0,n);
	for(i=0;i<=n-1;i++)
	    printf("%d ",a[i]);
	printf("\n\n");
	//快速排序 
	scanf("%d",&n);
	for(i=0;i<=n-1;i++)
	{
		a[i]=2*n-i;
		printf("%d ",a[i]);
	}printf("\n");
	quick_sort(0,n);
	for(i=0;i<=n-1;i++)
	    printf("%d ",a[i]);
	printf("\n");
	return 0;
 } 
    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/shamansi99/article/details/86800186
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞