合并排序是通过分治法对n个元素的排序的算法。当n=1时终止排序。否则向排序元素分为大小相同的两个子集,分别对两个子集进行排序。最终将排过序的子集进行合并。
void MergeSort (Type a[],int left ,int right )
{
if (left ,right )
{
int i = (left + right )/2;
MergeSort (a,left ,i );
MergeSort (a, i+1,right );
Merge (a , b , left , i , right) //合并数组
Copy (a,b,left ,right);
}
通过计算可知道 Merge和Copy的时间复杂度为O(n)所以该合并法的时间复杂度T(n)=4t(n/2)+O(n)
对于MergeSort的递归将排序集合一分为二,直至剩余一个元素,然后不断合并排序的数组,通过循环可以将数组相邻元素两两配对,通过合并算法构成n/2族长度为2的子数组,如此循环,即可完成排序。
void MergeSort (Type a[],int n)
{
Type * b = new Type [n];
int s = 1;
while ( s < n )
{
MergePass (a,b,s,n);
s += s;
MergePass (b,a,s,n);
s += s;
}
}
void MergePass (Type x[],Type y[],int s , int n) //合并大小为s的相邻子数组
{
int i=0;
while ( i <= n - 2 * s)
{
Merge ( x , y , i , i + s - 1 ,i + 2 * s - 1);
i = i +2 * s;
}
if ( i + s < n )Merge ( x , y , i , i + s - 1 , n - 1);
else
{
for (int j = i ; j <= n - 1; j++)
y [j]=x [j];
}
void Merge (Type c[],Type d[] , int l , int m , int r)
{
int i = 1 ;
int j = m + 1;
int k = l;
whle (( i <= m ) && ( j < = r ))
if ( c [i] <= c[j])
d [k++] = c [i++];
else
d [k++] = c[ j++];
if ( i > m )
{
for (int q=j ;q <= r ; q++)
d[k++] = c[q];
}
else
{
for (int q=i ;q <= m ; q++)
d[k++] = c[q];
}
}
自然合并排序是Merge合并排序的一个变形。对与出使给定的数组,通常存在多个长度大于1的自然排好序的自然数组。通过对数组的线性扫描就足以找出所有这些排好序的子数组段。然后进行两两组合,构成更大的子数组段。