二路归并排序
”2路“归并,把两个已经有序的序列合并成一个。
核心操作:把数组内的两个有序序列归并成一个。
- 空间复杂度O(n)
- 时间复杂度O(nlog2n)
//归并排序
int *B = (int *)malloc (n * sizeof(int)); //定义足够大的数组B
void Merge(int A[], int low, int mid, int high){
int i,j,k;
for(k=low; k<=high; k++){ //将A复制给B
B[k] = A[k];
}
for(i=low, j=mid+1, k=i; i<mid && j<=high; k++){ //将B中的元素均分,排序插入A
if(B[i]<=B[j])
A[k] = B[i++];
else
A[k] = B[j++];
}
//继续排序没有排序完的子序列
while(i<=mid) A[k++] = B[i++];
while(j<=high) A[k++] = B[j++];
}
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);
//递归调用
MergeSort(A, low, mid, high);
}
}
作者:Jace Jin
github地址:https://github.com/buxianghua
原创文章版权归作者所有.
欢迎转载,转载时请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
欢迎转载,转载时请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.