归并排序算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
using namespace std;
#define MAX 100
typedef struct node{
int r[MAX+1];
int length;
}seqlist,*pseqlist;
pseqlist Init_seqlist()
{
pseqlist pl;
pl=(pseqlist)malloc(sizeof(seqlist));
if(pl)
pl->length=0;
return pl;
}
void Merge(int r[],int rf[],int u,int v,int t)
{
int i,j,k;
for(i=u,j=v+1,k=u;i<=v&&j<=t;k++)
{
if(r[i]<=r[j])
rf[k]=r[i++];
else
rf[k]=r[j++];
}
while(i<=v)
rf[k++]=r[i++];
while(j<=t)
rf[k++]=r[j++];
}
void Msort(int p1[],int p2[],int n,int l)
{
int i=1,j;
while(i+2*l-1<=n)//i+2*l-1表示每次归并的尾元素下标{
Merge(p1,p2,i,i+l-1,i+2*l-1);
i=i+2*l;
}
if(i<=n)
Merge(p1,p2,i,i+l-1,n);
else
for(j=l;j<=n;j++)
p1[j]=p2[j];
}
void Mergesort(pseqlist s,int n)
{
int i,l=1,rf[100];//l表示要归并的两相邻有序序列中元素的个数之和while(l<=n)
{
Msort(s->r,rf,s->length,l);
l=l*2;
Msort(rf,s->r,s->length,l);
l=l*2;
}
for(i=1;i<=n;i++)
cout<
cout< } int main() { pseqlist pl; int n,i; pl=Init_seqlist(); cout<<"输入关键字个数n="; cin>>n; pl->length=n; cout<<"输入一组关键字: "; for(i=1;i<=n;i++) cin>>pl->r[i]; cout<<"输出归并排序序列:"< Mergesort(pl,n); return 0; }