实现《算法导论》里的算法,一步一步来。。。

合并过程中的变量容易搞错,特别不能忽略合并过程中数组边界的改变!!!
#include <iostream>
#include 
<string>
#include 
<vector>
#include 
<cmath>
using namespace std;

void Merge(int a[],int p,int k,int q)
{
   
int num1=k-p+1;
   
int num2=q-k;
   
int i;
   
int* b1=new int[num1+1];
   
int* b2=new int[num2+1];
   
for (i=0;i<num1;i++)
   
{
       b1[i]
=a[p+i];
   }

   b1[i]
=9999;
   
for (i=0;i<num2;i++)
   
{
       b2[i]
=a[k+i+1];
   }

   b2[i]
=9999;
   
int j=0;i=0;
   
for(int kk=p;kk<=q;kk++)    //注意!!!
   
{
       
if (b1[i]<=b2[j])
           a[kk]
=b1[i++];
       
else
           a[kk]
=b2[j++];
   }

   delete [] b1;
   delete [] b2;
}

void MergeSort(int a[],int p,int q)
{
   
if (p<q)
   
{
       
int k=(p+q)/2;
       MergeSort(a,p,k);
       MergeSort(a,k
+1,q);
       Merge(a,p,k,q);
   }

}

int main()
{
   
int n;
   scanf(
"%d",&n);
   
int* input=new int[n];
   
for (int i=0;i<n;i++)
   
{
       scanf(
"%d",&input[i]);
   }

   MergeSort(input,
0,n-1);
   
for (int i=0;i<n;i++)
   
{
       printf(
"%d ",input[i]);
   }

   delete [] input;
}