在SGI STL中,采用的排序法是IntroSort(一种比快速排序考虑更加周详的算法)。
而mergesort采用的是分而治之的思想,利用的是将两个有序的区间归并为一个有序区间,这通过STL中的inplace_merge可以实现。
先将区间对半分,左右两段各自排序,再利用inplace_merge重新组合为一个有序区间。对半分割的操作可以递归进行,知道每一小段的长度为0或1(那么这一小段也就实现自动排序了)。
template<class BidirectionalIter>
void mergesort(BiderectinalIter first,BiderectinalIter last)
{
typename iterator_traits<BiderectinalIter>::diffrence_type n=distance(first,last);
if(n==0||n==1)
return;
else
{
BiderectinalIter mid=first+n/2;
mergesort(first,mid);
mergesort(mid,last);
inplace_merge(first,mid,last);
}
}
mergesort的复杂度为O(N logN)。虽然和快速排序一样,但因为mergesort需要借助额外的内存,而且在内存之间移动(复制)数据也会耗时不少,所以mergesort的效率比不上快速排序。但实现简单、概念简单,是mergesort的两大优点。