下面是代码和示意图,一种是迭代一种是递归
首先是迭代:
#include<iostream>
using namespace std;
void Merge(int a[],int b[],int l,int m,int n)
{
//将两个已经排好序的数组a[l,...,m]和b[m+1,...,n]合并为
//有序的数组b[l,...,n]
for(int i1=l,iresult=l,i2=m+1;i1<=m && i2<=n;iresult++)
if(a[i1]<=a[i2])
{
b[iresult]=a[i1];
i1++;
}
else
{
b[iresult]=a[i2];
i2++;
}
if(i1>m)
for(int t=i2;t<=n;t++)
b[iresult+t-i2]=a[t];
else
for(int t=i1;t<=m;t++)
b[iresult+t-i1]=a[t];
}
void MergePass(int a[],int b[],int n,int len)
{
//当i<n-2len时,说明后面至少还有2个长度都为len的表需要合并否则需要做特殊处理
for(int i=0;i<=n-2*len;i+=2*len)
Merge(a,b,i,i+len-1,i+2*len-1);
if(i+len-1<n-1) //合并2个长度不想等的子表
Merge(a,b,i,i+len-1,n-1);
else //仅是复制最后一个子表,
for(int t=i;t<=n-1;t++)
b[t]=a[t];
}
void MergeSort(int a[],int n)
{
int *temp=new int[n];
for(int l=1;l<n;l*=2)
{
MergePass(a,temp,n,l); //l是当前被归并的子表的长度
l*=2;
MergePass(temp,a,n,l); //做最后一遍的时候,可能只是进行复制
}
delete[]temp;
}
int main()
{
int a[10]={2,6,4,8,9,7,10,1,3,5};
MergeSort(a,10);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
输出结果: 1 5 11 15 19 26 48 59 61 77
下面是归并过程示意图

下面是递归形式:
#include<iostream>
using namespace std;
struct Elem
{
int key;
int link;
};
int ListMerge(Elem list[],const int star1,const int star2)
{
//将分别由star1和star2指向的已排序的链表归并为一个已排序链表
//返回其首元素的下标,记录之间通过整形下标相连接
int iresult,istar,i1,i2;
if(list[star1].key<=list[star2].key)
{
istar=iresult=star1;
i1=list[star1].link;
i2=star2;
}
else
{
istar=iresult=star2;
i2=list[star2].link;
i1=star1;
}
while(i1!=-1 && i2!=-1)
{
if(list[i1].key<list[i2].key)
{
list[iresult].link=i1;
iresult=i1;
i1=list[i1].link;
}
else
{
list[iresult].link=i2;
iresult=i2;
i2=list[i2].link;
}
}
if(i1==-1)
list[iresult].link=i2;
else
list[iresult].link=i1;
return istar;
}
int rMergeSort(Elem list[],const int left,const int right)
{
//将list[left,...,right]按照kay大小升序排列
//每个记录的link初始为-1,返回已排序链表的首记录下标
if(left>=right) //最多只含一个元素
return left;
int mid=(left+right)/2;
//分别排序左右两边,且归并所得的两个排序链表
return ListMerge(list,rMergeSort(list,left,mid),rMergeSort(list,mid+1,right));
}
int main()
{
Elem list[10];
cout<<"输入要排序的是个数字:";
for(int i=0;i<10;i++)
{
cin>>list[i].key;
list[i].link=-1;
}
int t=rMergeSort(list,0,9);
while(list[t].link!=-1)
{
cout<<list[t].key<<" ";
t=list[t].link;
}
cout<<endl;
return 0;
}
输入和输出结果:
输入要排序的是个数字:26 5 77 1 61 11 59 15 48 19
1 5 11 15 19 26 48 59 61 77
Press any key to continue
示意图:


本文详细介绍了两种实现归并排序的方法:迭代法与递归法。提供了完整的C++代码示例,包括数组和链表的数据结构处理,展示了如何将两个已排序的数组或链表合并成一个有序序列。
4875

被折叠的 条评论
为什么被折叠?



