STL——sort函数简介
参考:http://blog.csdn.net/s030501408/article/details/5329477
0)与C标准库qsort的比较:http://bbs.csdn.net/topics/330202688
std::sort()比C标准库qsort快是肯定的,能快一倍,对于这一点的解释向来有两种,并且从STL的源码中也得到了确认。
一种是sort不是快速排序,而是多种排序的结合,这一点得到确认,STL的sort源码中可以看到快速排序、堆排序、归并排序等多种排序方式的结合,但是qsort在效率上也是做了优化的,比起一般快排要快得多,三种排序的结合又没有可能让STL的sort再比qsort快上一倍?
更多的说法是说qsort最后一个参数回调函数的影响,多次调用造成的后果。这也是肯定有开销的,但是使用改用内联并没有效率上的提升。
许多理论上的说法在实践中受多种因素的干扰往往会走样。好吧,简单的事:写个小程序测试一下呗。。。
STL里面有个sort函数,复杂度为n*log2(n)。使用这个函数,需要包含头文件(#include<algorithm>)。
1)格式:
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址,默认的排序方式是升序。
简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了。
对向量v排序:sort(v.begin(),v.end());
对符串类string排序:sort(strings,strings+100,cmp)。(需要cmp函数定义“小于运算”:bool cmp(string a,string b){return a<b;},#include<string>)
2)第三个参数:
排序的数据类型不局限于整数,对于没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。
比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。
想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp bool cmp(int a,int b) { return a>b; } 排序的时候就写sort(a,a+100,cmp);
3)一个实例:
# include<iostream> using namespace std; # include<string.h> # include<algorithm>//for STL struct Node { char number[7]; char name[9]; int score; }; bool Cmp1(Node a, Node b) { return strcmp(a.number, b.number) < 0; } bool Cmp2(Node a, Node b) { if (strcmp(a.name, b.name) != 0) { return strcmp(a.name, b.name) < 0; } return strcmp(a.number, b.number) < 0; } bool Cmp3(Node a, Node b) { if (a.score != b.score) { return a.score < b.score; } return strcmp(a.number, b.number) < 0; } Node node[100000]; int main() { int n, c, i, count = 1; //Node node[100000]; while (cin >> n >> c) { if (n == 0) { return 0; } else { for (i = 0; i < n; i++) { cin >> node[i].number >> node[i].name >> node[i].score; } switch (c) { case 1: { sort(node, node + n, Cmp1); break; } case 2: { sort(node, node + n, Cmp2); break; } case 3: { sort(node, node + n, Cmp3); break; } } cout << "Case " << count++ << ":" << endl; for (i = 0; i < n; i++) { cout << node[i].number << " " << node[i].name << " " << node[i].score << endl; } } } return 0; }