merge sort(归并排序) 是一种采用分治策略的排序方法。最坏时间复杂度为 O(nlgn)
要分析算法运行的时间复杂度,关键的就是要列出分治过程中的递归式:
然后,复杂度的估算可以使用递归树方法,也可以直接使用主定理来证明。详情请参考《算法导论》
我实现的C++ 版本代码如下所示:
/* MAXN为A的长度上限
inf 是一个大整数
数组计数从0开始
*/
void merge(int A[],int p,int m,int q) {
int i,j,k;
int L[MAXN+1], R[MAXN+1];
i = j = 0;
for(k = p ; k <= m ; k ++)
{
L[i++] = A[k];
}
for(k = m+1 ; k <= q ; k ++)
{
R[j++] = A[k];
}
L[i] = R[j] = inf;
i = j = 0;
for(k = p ; k <= q ; k ++)
{
if(L[i] < R[j]) {
A[k] = L[i++];
}
else {
A[k] = R[j++];
}
}
}
void merge_sort(int A[] , int p,int q) {
if(q > p) {
int m=(p+q)/2;
merge_sort(A,p,m);
merge_sort(A,m+1,q);
merge(A,p,m,q);
}
}
References:
[1] Thomas H.Cormen Charles E. Leiserson Ronald L.Rivest Clifford Stein 《Introduction to Algorithms Second Edition》