归并排序是将两个或两个以上有序表合并成一个有序表的过程;
2-路归并排序:n个记录的待排序表,看成n个有序的子表,两两合并,得到[n/2]个长度为2或1的有序表;再两两合并…,如此得到一个长度为n的有序表;
归并思想:当个数(1,0)、(1,1)、(0,1)时进行合并
[0, ,mid , ,h]
[0, ,mid ]
[0, mid/2]
[0 ,1][2]
[0][1]
左右根:
a
5/ 8\
b c
3/ 4\ 6/ 7\
d e f g
1 / 2\
h i
//递归算法,左右根
void MergeSort(ElemType A[],int low,int high){
if(low<high){
int mid=(high+low)/2; //从中间划分两个子序列
MergeSort(A,low,mid); //对左侧子序列递归排序
MergeSort(A,mid+1,high); //对右侧子序列递归排序
Merge(A,low,mid,high); //归并
}
}
ElemType *B=(ElemType *)malloc((n+1)*sizeof(ElemType));
//表A两段A[low..mid]和A[mid+1...high]各自有序,合并成新有序表A[low...high]
void Merge(ElemType A[],int low,int mid,int high){
for(int k=low;k<=high;k++)
B[k]=A[k];
for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
if(B[i]<=B[j])
A[k]=B[i++];
else
A[k]=B[j++];
}
while(i<=mid) A[k++]=B[i++];
while(j<=mid) A[k++]=B[j++];
}