(14)归并排序之二 2-路归并排序非递归形式
那么在递归形式的2-路归并排序中,会不停的申请容量为count的int数组,在递归调用中会占用大量的存储空间。为了节省存储空间的开销,可以考虑非递归的形式。
// 归并排序之非递归
void CMergingSort::MergeSort(void)
{
constint 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::MergeSort(void)
{
constint 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数组中。
}
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数组中。
}