//Merge sort BY ZHAODW
#include<stdio.h>
#define N 10
#define SENTINEL 1000
int source[N] = {1,9,2,8,3,7,4,6,5,10};
int L[N] = {0};
int R[N] = {0};
int merge(int* s,int p,int q,int r)
{
if(p == q)
return 0;
if(q - p > 1)
{
int pre = p + (r - p) / 2;
int aft = r + (q - r + 1) / 2;
merge(s,p,r,pre);
merge(s,r+1,q,aft);
}
int i = p;
for(;i <= r;i++ )
L[i-p] = s[i];
L[i - p] = SENTINEL;
i = r + 1;
for(;i <= q;i++)
R[i - r - 1] = s[i];
R[i -r -1] = SENTINEL;
i = 0;
int j = 0;
int k = p;
for(;k <= q;k++)
{
if(L[i] <= R[j])
{
s[k] = L[i];
i++;
}
else
{
s[k] = R[j];
j++;
}
}
return 0;
}
int main()
{
int p = 0,q = N - 1;
int r = p + (q - p) / 2;
merge(source,p,q,r);
int i = 0;
for(;i < N;i++)
printf("%d ",source[i]);
printf("\n");
return 0;
}
merge sort 源码
递归式为
T(n) = 2T(n/2) + O(n)
于是根据主方法,合并排序的时间复杂度为
O(nlgn)
合并排序没有最好和最差情况,同时需要额外的空间辅助排序
注意合并时候的哨兵 SENTINEL :)
解决递归式复杂度的主方法接下来介绍