分治:归并排序(Merge Sort)以及时间复杂度

通过递归的方法实现归并排序
对数组排序可分为以下几步
1)把前一半排序
2)把后一半排序
3)把两半归到一个新的有序数组,再拷贝回原数组
具体代码

#include
using namespace std;
void Merge(int a[],int s,int m,int e,int tmp[])//对数组从下标s到e分为[s,m],[m+1,e]两部分进行排序,tmp作为中转载体
{
 int pb=0;
 int p1=s,p2=m+1;
 while(p1<=m&&p2<=e){
  if(a[p1]<a[p2])
      tmp[pb++]=a[p1++];
  else
      tmp[pb++]=a[p2++]; 
 }//将有序的两部分比较,从小到大放入tmp中
 while(p1<=m)
     tmp[pb++]=a[p1++];
 while(p2<=e)
     tmp[pb++]=a[p2++];
 //将剩下的放入tmp中
 for(int i=0;i<e-s+1;i++)//将排好序的元素放回a数组
     a[s+i]=tmp[i];
}
void MergeSort(int a[],int s,int e,int tmp[])
{
 if(s<e){
  int m=s+(e-s)/2;
  MergeSort(a,s,m,tmp);//数组从下标s到m归并排序
  MergeSort(a,m+1,e,tmp);//数组从下标m+1到e归并排序
  Merge(a,s,m,e,tmp);//将[s,m][m+1,e]两部分归并为有序的数组
 }
}
int a[10]={13,27,19,2,8,12,2,8,30,89};
int b[10];
int main()
{
 int size=sizeof(a)/sizeof(int);
 MergeSort(a,0,size-1,b);
 for(int i=0;i<size;i++)
     cout<<a[i]<<",";
 cout<<endl;
 return 0;
}

时间复杂度的分析
对n个元素归并排序 可看为对两组n/2个元素归并排序并调用Merge函数一次
所以T(n)=2T(n/2)+an=4T(n/4)+2an=…=2kT(n/2k)+kan
一直做到n/2k=1
则T(n)=2kT(1)+kan=n+a*(log2n)n
时间复杂度即为O(n
logn)

c++小白 希望和大家一起讨论

你可能感兴趣的:(分治:归并排序(Merge Sort)以及时间复杂度)