实现过程
根据分治三步走策略,归并排序分为划分,递归,合并三个步骤
复杂度O(N*log2N)
划分
把序列分成左右尽量等长的两半
递归
分别对左右两边进行归并排序
合并
问题是。。。怎么把两个有序序列合并成一个大的有序序列?(;′⌒`)
合并策略:每次比较左右两个序列中最小的那一个,将更小的那个加入辅助空间(因为已经有序,所以若a<=b,则a一定<=b后面的数),然后再把辅助空间的有序序列复制回来即可。不难看出,需要辅助空间复杂度为O(N)。
代码:
void m_sort(int A[],int x,int y,int T[]){ int m=x+(y-x)/2; int p=x,q=m,i=x; m_sort(A,x,m,T); m_sort(A,m,y,T); while(p<m||q<y){ if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++];//从左半复制 else T[i++]=A[q++];//否则从右半复制 } for(i=x;i<=y;i++) A[i]=T[i]; }