# 5. 归并排序
基本思想
1)把 n 个记录看成 n 个长度为 l 的有序子表;
2)进行两两归并使记录关键字有序,得到[n/2]个长度为 2 的有序子表;
3)重复第(2)步,直到所有记录归并成一个长度为 n 的有序表为止。
// 相邻两个有序子序列的合并成算法 | |
/* 已知 r1 [low..mid] 和 r1 [mid+1..high] 分别按关键字有序排列,将它们合并成一个有序序列,存放在 r2 [low..high] */ | |
void Merge ( RecordType r1[], int low, int mid, int high, RecordType r2[]){ | |
i=low;j=mid+1; k=low; | |
while ( (i<=mid)&&(j<=high) ){ | |
if ( r1[i].key<=r1[j].key ){ | |
r2[k]=r1[i] ; ++i; | |
}else{ | |
r2[k]=r1[j] ; ++j; | |
} | |
++k ; | |
} | |
while( i<=mid ){ | |
r2[k]=r1[i]; | |
k++; | |
i++; | |
} | |
while( j<=high){ | |
r2[k]=r1[j]; | |
k++; | |
j++; | |
} | |
} /* Merge */ |
性能分析:
空间复杂度:O (n)
时间复杂度:O (nlog2n)
稳定