zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【机器学习具体解释】概率生成模型与朴素贝叶斯分类器
    Android中经常使用的bitmap处理方法
    微信第三方平台开发流程
    Java 文章链接
    Axure实现banner功能
    poi实现excel的导入导出功能
    github- 优秀资源总结
    java进阶文章优选链接,面试干货集合
    百万it资源百度网盘链接分享
    MySQL-Access denied for user 'username'@'localhost' (using password: YES) 解决
  • 原文地址:https://www.cnblogs.com/mmcmmc/p/3866337.html
Copyright © 2011-2022 走看看