二路归并排序C/C++
void Merge(int a[],int low,int mid,int high);
void MergeSort(int a[],int low,int high);
//将两个非降序序列low--mid,mid+1--high合并为一个新的非降序序列
void Merge(int a[],int low,int mid,int high)
{
int len = high-low+1;
int *temp = new int[len];
int i = low,j = mid+1; //i,j分别为两个子序列的游标
int k = 0; //为新合并序列的游标
while(i<=mid && j<=high){
if(a[i]<=a[j]){
temp[k] = a[i];
k++;
i++;
}else{
temp[k] = a[j];
k++;
j++;
}
}
while(i<=mid){ //若第一个子序列有剩余,则直接接到尾部
temp[k] = a[i];
k++;
i++;
}
while(j<=high){ //若第二个子序列有剩余,则直接接到尾部
temp[k] = a[j];
k++;
j++;
}
//copy到a[]
for(k=0;k<len;k++)
a[low+k] = temp[k];
}
//low high为待排序列左右边界
void MergeSort(int a[],int low,int high)
{
if(low<high){
int mid = (low+high)/2;
//递归的划分左右两个子序列
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
//合并
Merge(a,low,mid,high);
}
}
/* 算法分析:
time-complexity: 总共需要进行log2n趟排序,每次排序执行n次基本操作,
整个二路归并排序执行次数为nlog2n,时间复杂度为O(nlog2n)
space-complexity: 整个二路归并排序需要转存整个序列temp[len],因此空间复杂度为O(1)
算法稳定.
*/