8645 归并排序(非递归算法)
时间限制:1000MS 代码长度限制:10KB
提交次数:2398 通过次数:1192
题型: 编程题 语言: G++;GCC
Description
用函数实现归并排序(非递归算法),并输出每趟排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出每趟排序的结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
4 5 0 8 3 9 2 6 1 7
0 4 5 8 2 3 6 9 1 7
0 2 3 4 5 6 8 9 1 7
0 1 2 3 4 5 6 7 8 9
m表示每一趟排序中归并多少个元素,第一趟为2,然后是4,8…
d表示有序表分成多少份,比如10个元素第一趟分成5份归并排序,每份m(2)个
#include <iostream>
using namespace std;
void Merge(int R[],int T[],int low,int mid,int high)//将有序表R[low...mid]和R[mid+1...high]合并成有序表
{
int i=low,j=mid+1,k=low;
while(i<=mid&&j<=high)//将R中记录由小到大并入T中
{
if (R[i]<R[j])
{
T[k++]=R[i++];
}
else T[k++]=R[j++];
}
while(i<=mid) T[k++]=R[i++];//将剩余的数据并入T[]中
while(j<=high) T[k++]=R[j++];//将剩余的数据并入T[]中
}
void Mergesort(int A[],int n)
{
int T[n+5]= {0},i,j,low,mid,high;
int m=2,d;//m表示每一趟排序中归并多少个元素,第一趟为2,然后是4,8....
//d表示有序表分成多少份,比如10个元素第一趟分成5份归并排序,每份m(2)个元素
if (n%2!=0)
{
d=n/2+1;
}else
{
d=n/2;
}
while(d>1)
{
if(m>n)
{
high=n;
}
else
{
high=m;
}
// printf("d=%d m=%d\n",d,m);
for (low=1; low<=n;)
{
mid=(high+low)/2;
Merge(A,T,low,mid,high);
// printf("low=%d mid=%d high=%d\n",low,mid,high);
low=low+m;
high=high+m;
if (high>n)
{
high=n;
}
}
for (i=1; i<=n; i++)//将排序后数据复制到A[]中,以便进行下次排序
{
A[i]=T[i];
}
for (i=1; i<=n; i++)
{
printf("%d ",T[i]);
}
printf("\n");
m=m*2;
if (n%m!=0)
{
d=n/m+1;
}
else
{
d=n/m;
}
}
Merge(A,T,1,m/2,n);
for (i=1; i<=n; i++)
{
printf("%d ",T[i]);
}
}
int main()
{
int i,j,n;
scanf("%d",&n);
int A[n+5]={0};
for (i=1; i<=n; i++)
{
scanf("%d",&A[i]);
}
Mergesort(A,n);
return 0;
}