void copy(int *A, int *B, int i, int j)
{
for (int k = i; k < j; k++)
{
B[k - i] = A[k];
}
}
void merger(int *p,int n)
{
cout << n << endl;
if (n>1)
{
int b = n / 2;
int c = ceil(n / 2);
//向上取整+向下取整=n
int *B = new int[b];
int *C = new int[c];
copy(p, B, 0, b);
copy(p, C, c, n );
merger(B,b);
merger(C,c);
//开始把BC合并在一起。
int bhead = 0,chead=0;
for (int i = 0; i < n; i++)
{
if (B[bhead]<=C[chead])
{
p[i] = B[bhead];
bhead++;
}
else
{
p[i] = C[chead];
chead++;
}
if (bhead == b|| chead == c )
{
if (bhead == b )
{
for (int k = i + 1; k < n;k++)
{
if (chead == c)
break;
p[k] = C[chead++];
}
}
else
{
for (int k = i + 1; k < n; k++)
{
if (bhead == b)
break;
p[k] = B[bhead++];
}
}
break;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n;
int A[] = {4,4,1,2,4,1,4,1};
for (int i = 0; i < 8; i++)
{
cout << A[i];
}
cout << endl;
merger(A, 8);
for (int i = 0; i < 8; i++)
{
cout << A[i];
}
cin >> n;
return 0;
}
分析过程:用到的算法思想分治法,分治法的算法效率公式 T(n)=a*T(n/b)+f(n).这里a=b=2.根据公式,效率为nlog(n)