归并排序算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<r[i]<<" ";

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;

}

相关文档
最新文档