您的位置:首页 > 其它

归并排序(Merge Sort)

2014-07-02 12:09 211 查看
#include<stdio.h>
#include<malloc.h>

void Merge(int a[],int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
int *L=(int *)malloc(sizeof(int)*(n1)); //分配内存空间给未知大小的数组
int *R=(int *)malloc(sizeof(int)*(n2));
for(int i=0;i<n1;i++)       //i必须从0开始技术,而不是从p开始
L[i]=a[p+i];//此处(p+i)而非i,因为p可能不为0
for(i=0;i<n2;i++)
R[i]=a[q+1+i];
i=0;
int j=0;
int k=p;
while(i<n1&&j<n2&&k<=r)
{
if(L[i]<=R[j])
a[k++]=L[i++];
else
a[k++]=R[j++];
}
while(k<=r)
{
if(i<n1&&j>=n2)
a[k++]=L[i++];
if(i>=n1&&j<n2)
a[k++]=R[j++];
}

}

void MergeSort(int a[],int p,int r)
{
if(p<r) //如果没有这个限制,r一直会变小,进入死循环
{
int q=(p+r)/2;
MergeSort(a,p,q);
MergeSort(a,q+1,r);
Merge(a,p,q,r);
}
}

void main()
{
int a[10]={2,5,8,7,6,9,0,3,1,4};
MergeSort(a,0,9);
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: