您的位置:首页 > 其它

归并排序

2014-05-02 17:06 99 查看
#include<stdio.h>

void merge_sort(int *A,int x,int y,int *T)

{

if(y-x>1)//y-x表示要排序的这一段元素的个数x为元素的首地址y为边界但达不到

{

int m=x+(y-x)/2;//分成两段一段为[x,m)另一段位[m,y)

int p=x,q=m,i=x;

merge_sort(A,x,m,T);//排[x,m)x为首地址m为边界

merge_sort(A,m,y,T);//排[m,y)

while(p<m||q<y)//因为先递归,所以当函数归来时[x,m)有序[m,y)有序while控制的是两个区间有一个非空就复制到T数组

{

if(q>=y||(p<m&&A[p]<=A[q]))//左边的数组复制到T数组

T[i++]=A[p++];

else

T[i++]=A[q++];//右边的数组复制到T数组中

}

for(i=x;i<y;i++)//把T数组复制到A数组中

A[i]=T[i];

}

}

int main()

{

int n,m,a[1000],b[1000],i;

while(scanf("%d",&n)!=EOF)

{

for(i=0;i<n;i++)

scanf("%d",&a[i]);

merge_sort(a,0,n,b);

for(i=0;i<n;i++)

printf("%d ",a[i]);

puts("");

}

return 0;

}

/*例如

5

5 4 3 2 1

先分成5 4和3 2 1

递归左边5 4再递归成一个即5和4发现不满足条件即1个数不用排序,

递归回来后 执行while循环排5 4

p=0 m=1 y =2 x=0

把4复制到T数组

把5复制大T数组

这时T数组为T[0]=4,T[1]=5;

A数组没变

执行for循环

i=0 y=2

4 5把5 4覆盖

3 2 1类似

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: