gxc

永远不要认为有什么事情是理所当然的!

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
每个递归程序都有一个等价的非递归程序和它相对应,而计算的顺序相反。
既然自顶向下的归并排序是一个递归,那么也应该有一个自底向上的非递归算法和它相对应。
自底向上的归并排序对整个数组进行若干个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));
                }
            }
        }
posted on 2006-01-11 11:15  gxc  阅读(1459)  评论(1编辑  收藏  举报