算法分析:
归并排序的思想其实也是将大问题分解成很多小问题
在此例中可以建一个序列分成若干个小序列,然后进行排序,排序之后再合并!
如有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了
该算法是稳定的!