//
将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);
}
}
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);
}
}