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)。