这里只讨论二路归并排序:
其思想为:将两个有序的子区间合并成一个有序的子区间,合并完成后,有序子区间的
的数目减半,但区间的长度增加一倍;当区间的长度从1增加到n的时候,整个区间变成
一个,这个区间即为我们所需的排序结果。
算法实现如下:
void merge(elemtype R[], elemtype A[], int startIndex, int midIndex, int endIndex)
//将R[startIndex]~R[midIndex]和R[midIndex]~R[endIndex]两个子区间合并,存入A
{
int i = startIndex, j=midIndex+1, k = startIndex;
while(i <= midIndex && j <= endIndex)
{
if(R[i] > R[j])
A[k++] = R[j++];
else
A[k++] = R[i++];
}
while(i <= midIndex) //复制第一个区间剩下的元素
A[k++] = R[i++];
while(j <= endIndex) //复制第二个区间剩下的元素
A[k++] = R[j++];
for(i=startIndex; i<=endIndex; i++)
R[i] = A[i];
}
void mergepass(elemtype R[], elemtype A[], int n, int c)
{
int j,i;
i=0;
while (i + 2*c-1 <= n-1) //长度均为c的区间合并
{
merge (R, A, i, i+c-1, i+2*c-1);
i +=2*c;
}
if (i + c -1 < n)
merge(R, A, i, i+c-1, n-1); // 长度不等的两个区间合并
else
for(j = i; j <= n-1; j++) // 只有一个区间时直接复制
A[j] = R[j];
}
void mergesort(elemtype R[], int n)
{
int c = 1;
elemtype A[100];
while (c < n)
{
mergepass(R, A, n, c);
c *=2;
}
}