归并排序
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类似
*/
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类似
*/
相关文章推荐
- 第十六周项目6—归并排序
- 归并排序
- 归并排序(Merge_Sort)
- sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding
- nyoj 求逆序数(归并排序)
- POJ 2299 Ultra-QuickSort (归并排序)
- 归并排序
- 排序4:普通归并排序
- 归并排序
- 归并排序
- java 算法之归并排序详解及实现代码
- 归并排序
- 分治思想之归并排序
- 归并排序
- 算法导论-归并排序
- 排序之归并排序
- 归并排序(Merge Sort)+计算数列逆序数
- 常见排序算法导读(9)[归并排序]
- 归并排序
- 归并排序&归并排序求逆序对