归并排序
归并排序就是将两个有序序列合并成为一个有序序列。因此,将两个有序子序列合并成一个有序序列是归并排序的基础算法。
两个有序子序列合并
void Merge(int a[],int b[],int l,int m,int h){
int i,j,k;
int i=1;j=m+1;k=1;
while(i<=m&&j<=h){
if(a[i]<a[j]){b[k]=a[i];i++;k++;}
else{b[k]=a[j];j++;k++;}
}
while(i<=m){b[k++]=a[i++];}
while(j<=h){b[k++]=a[j++];}
}
**递归归并排序:**将无序序列S[s:t]分成等长的两部分,S[s:m]、S[m+1,t]。(m=(s+t)/2)对这两个序列分别进行归并排序,然后将其排序结果进行有序合并。由于两个部分仍然可能是无序的,所以此过程要递归执行,直到每个子序列只有一个元素为止,然后再进行无序操作。
void Msort(int S[],int T[],int s,int t){
int R[t-s+1];
if (s==t){T[s]=S[s];}
else{
m=(s+t)/2;
Msort(S,R,s,m);
Msort(S,R,m+1,t);
Merge(R,T,s,m,t;)
}
}
**迭代归并排序:**对于长度为n的待排序线性表,将其看为n个长度为1的有序子表,然后将相邻的有序子表两两合并,得到n/2个长度为2或1的有序子表,接着依次两两合并直到合并成一个表。
void Msort(int R[],int T[],int n){
int len=1;
while(len<n){
Msort(R,T,n,len);
len*=2;
}
}