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

你可能感兴趣的:(sort)