1、算法:
归并排序(Mergesort)是一种概念上最为简单的排序算法,该算法的性能很好,采用分而治之的思想,把待排序的列表分成片段,先处理各片段,再通过某种方式把片段重组。
当归并排序算法为一个数组排序时,如果把归并结果放到另一个数组中,那么归并过程很简单。但是,这将使得归并排序的空间代价为原本的两倍,这是归并排序的严重缺陷。为避免每一次归并都使用一个新数组,可把排序好的子数组首先复制到辅助数组中,然后再把它们归并回原数组。
2.代码:
template<typename E>
void mergesort(E A[], int n){
E temp[n];
mergesort(A, temp, 0, n-1);
}template<typename E>
void mergesort(E A[], E temp[], int left, int right){
if(left==right) return;
int mid=(left+right)/2;
mergesort(A, temp, left, mid);
mergesort(A, temp, mid+1, right);
for(int i=left; i<=right; i++) temp[i]=A[i];
int x=left, y=mid+1;
for(int curr=left; curr<=right; curr++){
if(x==mid+1) A[curr]=temp[y++];
else if(y>right) A[curr]=temp[x++];
else if(temp[x]<temp[y]) A[curr]=temp[x++];
else A[curr]=temp[y++];
}
}
3.分析:
在所有log n层递归中,每一层都需要O(n)时间代价,因此总时间为O(n log n)。