合并排序实现和分析



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)


猜你喜欢

转载自blog.csdn.net/qq_20949153/article/details/51173309