gxc

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

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

归并算法最原始的思想来源于将两个已排好序的数组a和b合并成一个排好序的数组c,
        void MergeAB(int[] c, int[] a,int[] b)
        {
            int M = a.Length;
            int N = b.Length;
            for (int i = 0, j = 0, k = 0; k < M + N; k++)
            {
                if (i == M) c[k] = b[j++];
                else if (j == N) c[k] = a[i++];
                else if (a[i] > b[j]) c[k] = a[i++];
                else c[k] = b[j++];
            }
        }
在上面的算法中,用到了两个条件判断数组a或b是否到了结尾,当然,判断得到的值很大部分是false。可以使用标志关键字办法来避免这两个判断,对于归并排序,有一个很好的方法,将第二个数组倒序放在第一个数组的后面,然后两个指针从两边向中间靠拢,这样两个数组各自的最大元素就是它们各自的标志关键字了。
        void Merge(int[] a,int l,int m,int r)
        {
            int M = r-l+1;
            int[] c=new int[M];
            int i,j;
            //第一个数组顺序放,i指向数组头
            for (i = m; i >=l; i--)
            {
                c[i-l] = a[i];
            }
            //第二个数组倒序放,j指向数组尾
            for (j = m+1; j <= r; j++)
            {
                c[r+m+1-j-l] = a[j];
            }
            for (int k = l; k <= r; k++)
            {
                if (c[i] > c[j])
                {
                    a[k] = c[j--];
                }
                else
                {
                    a[k] = c[i++];
                }
            }
        }

posted on 2006-01-09 23:20  gxc  阅读(497)  评论(2编辑  收藏  举报