归并排序的内容可在紫书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;
}