那么在递归形式的2-路归并排序中,会不停的申请容量为count的int数组,在递归调用中会占用大量的存储空间。为了节省存储空间的开销,可以考虑非递归的形式。
// 归并排序之非递归
void CMergingSort::MergeSort(void)
{
const int count = 9;
int A[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
int step = 1;
int B[count] = {0};
//决定趟数
while (step < count)
{
MergePass(A, B, step, count);//#1
step = 2 * step;
MergePass(B, A, step, count);//作用1:和#1轮替执行,保证源数据是被部分归并过的;
step = 2 * step; //作用2:在归并完成后再调用一次,把最终归并结果copy到A数组中
} //其实是调用了MergePass里最后的for循环。
//打印排序结果。
for (int i = 0; i < count; ++ i)
{
cout << A[i] << "\t";
}
cout << endl;
}
// 归并排序非递归之一趟归并
void CMergingSort::MergePass(int C[], int D[], int step, int len)
{
//决定每一趟需要几次归并
int i = 0;
while (i <= len - 2 * step)//一组一组地进行归并(这两组是)
{
Merge(C, D, i, i + step - 1, i + 2 * step - 1);
i += 2 * step;
}
if (i + step < len)//如果剩余元素够一组再进行一次归并
Merge(C, D, i, i + step - 1, len - 1);
else
for (int j = i; j <= len - 1; j++)//作用1:如果元素不够一组那么直接把剩余元素copy到目标指针所指向的空间
D[j] = C[j]; //作用2:一切元素都归并完成之后,把最终归并结果copy到A数组中。
}