每个递归程序都有一个等价的非递归程序和它相对应,而计算的顺序相反。
既然自顶向下的归并排序是一个递归,那么也应该有一个自底向上的非递归算法和它相对应。
自底向上的归并排序对整个数组进行若干个m-m的归并排序,m的值从1开始每次变成原来的2倍。如果某次排序时,数组的长度刚好是m的倍数的话,那么该次排序的最后2个子数组对刚好大小是m和m,可以作m-m排序;否则只能作m-x排序,x比m要小。
int min(int a, int b)
{
return (a>=b)?a:b;
}
void MergerSort(int[] a,int l,int r)
{
for (int m = 1; m <= r - l; m = m + m)
{
for (int i = l; i <= r - m; i = i + 2 * m)
{
Merge(a, i, i + m - 1, min(i + 2 * m - 1, r));
}
}
}
既然自顶向下的归并排序是一个递归,那么也应该有一个自底向上的非递归算法和它相对应。
自底向上的归并排序对整个数组进行若干个m-m的归并排序,m的值从1开始每次变成原来的2倍。如果某次排序时,数组的长度刚好是m的倍数的话,那么该次排序的最后2个子数组对刚好大小是m和m,可以作m-m排序;否则只能作m-x排序,x比m要小。
int min(int a, int b)
{
return (a>=b)?a:b;
}
void MergerSort(int[] a,int l,int r)
{
for (int m = 1; m <= r - l; m = m + m)
{
for (int i = l; i <= r - m; i = i + 2 * m)
{
Merge(a, i, i + m - 1, min(i + 2 * m - 1, r));
}
}
}