归并算法最原始的思想来源于将两个已排好序的数组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++];
}
}
}