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;
}
View Cod
posted @ 2014-07-24 19:23  mmcmmc  阅读(268)  评论(0编辑  收藏  举报