(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::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数组中。
}
posted @ 2011-11-25 10:58  jeffkuang  阅读(144)  评论(0)    收藏  举报