其排序算法的基本思想就是,将原序列**(假设有n个关键字)**分成很多个子序列每个子序列就有一个关键字且子序列之间是个不相同的。之后就是将两两的子序列进行合并,所以整个数据规模就变成了n/2,之后在进行重复操作,数据规模不断的除以2,直至变为1。
以下是代码:
void Merge(int A,int low,,int mid ,int high ){
int i=low;
int j=mid+1;
int k=0;
int *temp=new int[high-low+1];
if(temp!=NULL){
cout << "数组分配失败";
exit(0);//结束该进程;
}
while(i<=mid&&j<=high){
if(A[i]>A[j]){
temp[k]=A[j];
j++;
k++;
}
else{
temp[k]=A[i];
k++;
i++;
}
}
while(i<=mid){
temp[k++]=A[i++];
}
while(j<=high){
temp[k++]=A[j++];
}
for(int i=low;int j=0;i<=high){
A[i]=temp[j];
}
delete []temp;//注意释放空间。
}
void MergeSort(int R[],int low, int high){
if(low<high){
}
int mid=(low+high)/2;
MergeSort(R[],low,mid);
MergeSort(R[],mid+1,high);
Merge(R[],low,mid,high);//它的功能就是将low~mid与mid+1~high的两个有序序列合并成一个有序序列
}
`分析其时间复杂度:
第一趟:需要执行2*(n/2)=n次基本操作,其中2是每个子序列中关键字的个数,n/2是要对多少子序列进行归并操作。
第二趟:4*(n/4)=n次操作。
第三趟:8*(n/8)=n次操作。
.........
第k趟:2的k次方*(n/2的k次方)=n;
其中2的k次方=1,只进行一次归并操作,即仅有两个子序列。k=log2n;
并且其时间复杂度与初始序列无关,所以不论是最好还是最坏的情况其时间复杂度都是O(nlog2n)。
其空间复杂度是因为需要转存整个序列所以是O(n)。