下面是伪代码,注意其数列的起始位置是1:
MERGE(A,q,p,r)
n1=q-p+1
n2=r-q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i=1 to n1
L[i]=A[p+i-1]
for j=1 to n2
R[j]=A[q+j]
L[n1+1]=key1
R[n2+1]=key2
i=1
j=1
for k=p to r
if L[i]<=R[j]
A[k]=L[i]
i=i+1
else A[k]=R[j]
j=j+1
可以从下图中看出,所谓“分治法”即“分”+“治”——divide(split)+conquer(merge)
下面是C++代码实现,肯定还没实现= =
int merge(int A[],int p,int q,int r)//q means the start, q means the mid, r means the last
{
int n1,n2,i,j,k;
n1=q-p+1;
n2=r-q;
int L[n1+1],R[n2+1];
for(i=0; i<=n1-2; i++)
{
L[i]=A[p+i-1];
}
for(j=0; i<=n2-2; j++)
{
R[j]=A[q+j];
}
int infinate_L,infinate_R;
L[n1+1]=infinate_L;
R[n2+1]=infinate_R;
i=1;
j=1;
for(k=p; k<=r-1; k++)
{
if (L[i]<=R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
}
下面是MoreWindows的代码:
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}