void Merge(Left,LeftEnd,Right,RightEnd)
1.填TmpA数组(从Left开始填到RightEnd)
如果A[Left]<=A[Right],填A[Left++];不然填A[Right++];
Left>LeftEnd或Right>RightEnd时退出
再填入剩下的A[Left]或A[Right]
2.填回A数组(从A[RightEnd]开始填到填完本次所有元素)
一、递归算法
MSort(Left,RightEnd)
只有一个元素时:Left==RightEnd,直接返回;
有两个元素时: Left==RightEnd-1,两个MSort直接返回,只执行一个Merge,能将两元素按顺序放置在合适的位置上
每次可以返回数组某个部分的排序结果
例:
A={55,46,78,5,7,9}
因为TmpA跟A对应的顺序是一样的,因此一个完整排序也只需要一个TmpA,
如果在Merge函数里申请,则费时费空间
二、非递归算法
一趟Merge:
length从1->2->4->…
两有序子列慢慢从小变大
但是因为不一定是偶数个,最后几次末尾可能会剩元素,
因为内部有序只要贴在末尾就行了,等待最后一步使整个序列完全有序
非递归算法同一函数接口:
归并排序缺点:
1.需要一块额外的空间(与原数据量一样大)
2.两数组之间反复复制的操作
因此归并排序一般不用于内部排序