惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
D
DataBreaches.Net
腾讯CDC
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
罗磊的独立博客
月光博客
月光博客
MyScale Blog
MyScale Blog
U
Unit 42
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
G
Google Developers Blog
博客园 - 【当耐特】
D
Docker
I
InfoQ
雷峰网
雷峰网

博客园 - gxc

C#2.0中的泛型约束(转载) 解决‘“System.Configuration.ConfigurationSettings.AppSettings”已过时’的警告 《雷神之锤III》里求平方根倒数的函数 回溯法(vc)百鸡百钱问题 回溯法(vc)八皇后问题 六十六条经典禅语 prototype.js和Ajax 悖论 标签的使用(2) 标签的使用(1) 自底向上的归并排序 自顶向下的归并排序 Josephus问题(循环链表) 找质数算法(Sieve of Eratosthenes筛法) 堆排序 直接选择排序 快速排序算法 Some of the new features from ASP.NET 2.0 在ASP.NET中使用AJAX
归并排序之归并算法
gxc · 2006-01-09 · via 博客园 - 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++];
                }
            }
        }