// 将a[p...r] 和a[r+1...q] 合并到 b[0...q-p]
void Merge2Sort(int *a, int *b, int p, int r, int q)
{
int i = p, j = r+1, k = 0;
while(i<=r && j<=q)
{
if(a[i] < a[j])
b[k++] = a[i++];
else
b[k++] = a[j++];
}
while(i<=r)
b[k++] = a[i++];
while(j<=q)
b[k++] = a[j++];
}
// 多段二路合并:
//a[p...q],每len个元素为一个有序段,将这些连续有序段合并为一个有序段存入b[ ]
void MergeMSort(int *a, int *b, int p, int q, int len)
{
int i = p, j = 0, k;
while(i + 2*len-1 <= q)
{
Merge2Sort(a, b+j, i, i+len-1, i+2*len-1);
i += 2*len;
j += 2*len;
}
if(i+len <=q) // Two segments
Merge2Sort(a, b+j, i, i+len-1, q);
else
for(k=i; k<=q; k++)
b[j++] = a[k];
}
// a[p...q] 归并排序 using by b[0...q-p]
void MergeSort(int *a, int* b, int p, int q)
{
int len = 1;
while(len < q-p+1)
{
// a[p...q] -> b[0...q-p]
MergeMSort(a, b, p, q, len);
len *= 2;
// b[0...q-p] -> a[p...q]
MergeMSort(b, a+p, 0, q-p, len);
}
} 
归并排序详解

本文详细介绍了一种高效的排序算法——归并排序,并提供了具体的实现代码。文章通过两部分展开:二路归并排序与多段二路归并排序,旨在帮助读者深入理解归并排序的工作原理及其应用。
1832

被折叠的 条评论
为什么被折叠?



