预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://www.cnblogs.com/hxsyl/archive/2012/09/13/2683095.html"STL排序算法 收集整理:长高的方法HYPERLINK"http://www.kittybuy.com"www.kittybuy.com STL中有多种排序算法,各有各的适用范围,下面听我一一道来: I、完全排序 sort() 首先要隆重推出的当然是最最常用的sort了,sort有两种形式,第一种形式有两个迭代器参数,构成一个前开后闭的区间,按照元素的less关系排序;第二种形式多加一个指定排序准则的谓词。sort基本是最通用的排序函数,它使用快速排序算法,并且在递归过程中,当元素数目小于一个阈值(一般是16,我的试验是24)时,转成直接插入排序。伟大的数学家Knuth已经证明,在平均意义上,快速排序是最快的了;当然,最坏复杂性比较差。sort要求随机迭代器,因此对于很多编译器来说,对于前向迭代器(如list)使用sort是一个编译错误。 #include<vector> #include<algorithm> #include<functional> #include<cstdlib> usingnamespacestd; voidfunc1() { vector<int>ar; //向数组里面插入一些随机数 generate_n(back_inserter(ar),100,rand); //按从小到大排序 sort(ar.begin(),ar.end()); } /* list<int>l1; fill_n(back_inserter(l1),200,1000); */ 如何从大到小逆排序,这个其实有很多种方式实现。 1voidfunc2() 2{ 3vector<int>ar; 4//向数组里面插入一些随机数 5generate_n(back_inserter(ar),100,rand); 6 7//方法1:使用函数作为谓词 8sort(ar.begin(),ar.end(),GreateThan); 9//方法2:使用仿函数作为谓词 10//注意下面两种方法都需要有个括号,实际上是要产生一个临时对象 11sort(ar.begin(),ar.end(),CompareInt()); 12//方法3:使用预定义的Adapter,定义在<functional>中 13sort(ar.begin(),ar.end(),greater<int>()); 14//方法4:正常排序,然后翻转过来 15sort(ar.begin(),ar.end()); 16reverse(ar.begin(),ar.end()); 17//方法5:使用逆迭代器 18sort(ar.rbegin(),ar.rend()); 19} 1.stable_sort sort优点一大堆,一个缺点就是它不是一种稳定的排序。什么是排序的稳定性?就是如果出现两个元素相等时,要求排序之后他们之间保持原来的次序(比如我们先按学号排序,然后按成绩排序,这时就希望成绩相同的还是按照学号的次序排)。很可惜,快速排序算法就不是稳定的,要追求这个,只好用stable_sort了。 在各种排序算法中,合并排序是稳定的,但一般的合并排序需要额外的O(N)的存储空间,而这个条件不是一定能够满足的(可能是比较奢侈的)。所以在stable_sort内部,首先判断是否有足够的额外空间(如vecotr中的cap()-size()部分),有的话就使用普通合并函数,总的时间复杂性和快速排序一个数量级,都是O(N*logN)。如果没有额外空间,使用了一个merge_without_buffer的关键函数进行就地合并(如何实现是比较有技巧的,完全可以专门谈一谈),这个合并过程不需要额外的存储空间(递归的堆栈除外),但时间复杂度变成O(N*logN),这种情况下,总的stable_sort时间复杂度是O(N*logN*logN)。 总之,stable_sort稍微慢一点儿,但能够保证稳定,使用方法和sort一样。但很多时候可以不用这种方式和这个函数,比如上面的例子,完全可以在排序比较准则中写入成绩和学号两个条件就OK了。 2.sort_heap 堆排序也是一种快速的排序算法,复杂度也是O(N*logN)。STL中有一些和堆相关的函数,能够构造堆,如果在构造好的堆上每次取出来根节点放在尾部,所有元素循环一遍,最后的结果也就有序了。这就是sort_heap了。它的使用要求区间已经被构造成堆,如: 1voidfunc5() 2{ 3vector<int>ar; 4//生成数据 5generate_n(back_inserter(ar),