归并算法
将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]。
void Merge(RedType SR[],RedType TR[],int i,int m,int n)
{ /* 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] */
int j,k,l;
for(j=m+1,k=i;i<=m&&j<=n;++k) /* 将SR中记录由小到大地并入TR */
if LQ(SR[i].key,SR[j].key)
TR[k]=SR[i++];
else
TR[k]=SR[j++];
if(i<=m)
for(l=0;l<=m-i;l++)
TR[k+l]=SR[i+l]; /* 将剩余的SR[i..m]复制到TR */
if(j<=n)
for(l=0;l<=n-j;l++)
TR[k+l]=SR[j+l]; /* 将剩余的SR[j..n]复制到TR */
}
将SR[s..t]归并排序为TR1[s..t]。
void MSort(RedType SR[],RedType TR1[],int s, int t)
{ /* 将SR[s..t]归并排序为TR1[s..t]。*/
int m;
RedType TR2[MAXSIZE+1];
if(s==t)
TR1[s]=SR[s];
else
{
m=(s+t)/2; /* 将SR[s..t]平分为SR[s..m]和SR[m+1..t] */
MSort(SR,TR2,s,m); /* 递归地将SR[s..m]归并为有序的TR2[s..m] */
MSort(SR,TR2,m+1,t); /* 递归地将SR[m+1..t]归并为有序的TR2[m+1..t] */
Merge(TR2,TR1,s,m,t); /* 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t] */
}
}
对顺序表L作归并排序。
void MergeSort(SqList *L)
{ /* 对顺序表L作归并排序。 */
MSort((*L).r,(*L).r,1,(*L).length);
}
C++可执行代码:
#include<iostream>
using namespace std;
void merge(int a[],int b[],int low,int m,int high)
{
int i=low,j=m+1;
int k=low;
for(;i<=m&&j<=high;)
{
if(a[i]<=a[j])
{
b[k]=a[i];
k++;i++;
}
else
{
b[k]=a[j];
k++;
j++;
}
}
if(i<=m)
{
for(int l=0;l<=m-i;l++)
b[k++]=a[i+l];
}
if(j<=high)
{
for(int l=0;l<=high-j;l++)
b[k++]=a[j+l];
}
// 此处错误, 需要将B拷入A
}
void mergesort(int a[],int b[],int low,int high)
{
if(low==high)
b[low]=a[low];
else
{
int m=(low+high)/2;
mergesort(a,b,low,m);
mergesort(a,b,m+1,high);
merge(a,b,low,m,high);
}
}
int main()
{
int a[20];int b[20];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
mergesort(a,b,0,n-1);
for(int i=0;i<n;i++)
cout<<b[i]<<' ';
cout<<endl;
}
return 0;
}