归并排序

来源:互联网 发布:php 文章置顶 编辑:程序博客网 时间:2024/06/13 04:58

算法分析:

归并排序的思想其实也是将大问题分解成很多小问题

在此例中可以建一个序列分成若干个小序列,然后进行排序,排序之后再合并!

如有n个记录,我们可以讲n个记录的每一个记录看成为一个队列,拥有n个队列,我们又可以将相邻的排序之后合并,那么我们就拥有了n/2个队列,每个队列最多2个元素,

那么这样下去,我们最后就可以将其组成一个有序队列!

 

代码实现:

void Merge(int A[],int B[],int s,int m,int l){
 int i,j,k;
 int Location=s;
 i=s;
 j=m+1;
 while(i<=m&&j<=l){
  if(B[i]<=B[j]){
   A[Location++]=B[i++];
  }
  else
  {
   A[Location++]=B[j++];
  }
 }
 if(i<=m){
  for(k=i;k<=m;k++){
   A[Location++]=B[k];   //在   ~_~   这里大率一跤啊,注意细节啊,要细心!
  }
 }
 else{
  for(k=j;k<=l;k++){
   A[Location++]=B[k];
  }
 }
}

void MergePass(int A[],int B[],int len,int n){
 int start;
 start=0;
 while(start<=len-2*n){//包含一个减1和一个加1
  Merge(A,B,start,start+n-1,start+2*n-1);
  start+=2*n;
 }
 
 if(start+n-1<len-1){   //注意两边的-1没抵消是提醒该处的特别意思!
  Merge(A,B,start,start+n-1,len-1);
 }
 else{
  for(int i=start;i<len;i++){
   A[i]=B[i];
  }
 }
}

void MergeSort(int A[],int len){
 int *B=(int *)malloc(sizeof(int)*len);
 int n=1;
 while(n<len){
  MergePass(B,A,len,n);
  n=2*n;
  MergePass(A,B,len,n); 
  n=2*n;
 }
}

 


void print(int A[],int len){
 int i=0;
 for(i=0;i<len;i++)
  cout<<A[i]<<" ";
 cout<<endl;
}


void main(){
 
 int A[15]={12,3,4,6,98,123,3,56,78,11,65,455,324,0,1};
 print(A,15);
 //BinarySort(A,15);
 //HeapSort(A,15);
 //HeapSortData(A,15);
 MergeSort(A,15);
 print(A,15);

}

算法分析:在最外层循环中最多执行lgn次循环(MergeSort函数中),而在MergePass内层循环中,最多比较n-1次,那么就可以知道

该算法的时间复杂度为nlgn了

该算法是稳定的!