STL中与快速排序媲美的merge sort

在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的两大优点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值