</pre><pre name="code" class="cpp">#include <iostream>
using namespace std;
void recurMergeSort(int*, int, int, int);
void merge(int*, int, int, int, int);
void mergeSort(int *A, int len)
{
if(A==NULL || len <= 0)
{
return;
}
int low = 0;
int high = len-1;
recurMergeSort(A, len, low, high);
}
void recurMergeSort(int *A, int len, int low, int high)
{
if(A==NULL||low>=high)
{
return;
}
int mid = (low+high)/2;
recurMergeSort(A, len, low, mid);
recurMergeSort(A, len, mid+1, high);
merge(A, len, low, mid, high);
}
void merge(int *A, int len, int low, int mid, int high)
{
int leftLen = mid-low+1;
int rightLen = high-low;
int *left = new int[leftLen];
int *right = new int[rightLen];
int i=0;
int j=0;
for(i=0; i<leftLen; i++)
{
left[i] = A[low+i];
}
for(j=0; j<rightLen; j++)
{
right[j] = A[mid+1+j];
}
int k = low;
while((i<leftLen)&&(j<rightLen))
{
if(left[i] <= right[j])
{
A[k] = left[i];
i++;
}
else
{
A[k] = right[j];
j++;
}
k++;
}
while(i<leftLen)
{
A[k] = left[i];
k++;
i++;
}
while(j<rightLen)
{
A[k] = right[j];
j++;
k++;
}
delete left;
left = NULL;
delete right;
right = NULL;
}
归并是一种时间复杂度为O(nlogn)的排序算法,因为T(n)=2*T(n/2)+n的递推式。空间复杂度O(n),这个当时和我的小伙伴争论了一下子,的确应该是以最大运行需要空间为尺度,我一开始以为我每次new了之后,delete就不占空间了,但是其实在new的时候就占用了。
归并是稳定的,它是外排序中很重要的一种算法。