C++STL sort排序内部机制--Apple的学习笔记

STL sort实现原理:

STL中的sort并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。

既然选择用c++11做vslam了,STL是必须学习的。本着不重复造轮子,站在巨人的肩膀上的原则。当然还是要理解下STL中的机制,并且自己体验一把,才能确认STL库确实是好用的,而不是别人说好用就是好用~

c++ code

    #include <chrono>
    #include <iostream>
    #include <unistd.h>
    #include <thread>
    #include <vector>
    #include <algorithm>
    using namespace std;
    /*
    ratio<3600, 1>           hours
    ratio<60, 1>             minutes
    ratio<1, 1>              seconds
    ratio<1, 1000>           milliseconds
    ratio<1, 1000000>        microseconds
    ratio<1, 1000000000>     nanosecons
    */
    #define LEN 10000
    
    int main()
    {
        int n=0;
        int min=0;
        vector<int> v1;
        for( int i = 0; i != LEN; ++i )
        {
            v1.push_back(rand()%10);
        }
        //copy(v1.begin(), v1.end(), v2.begin()); 
        vector<int> v2(v1.begin(), v1.end());   //创建一个copy副本,使用冒泡排序
        auto beginTime = chrono::high_resolution_clock::now();
        sort( v1.begin(), v1.end()); //从小到大排序,使用STL排序
        auto endTime = chrono::high_resolution_clock::now();
        auto elapsedTime= chrono::duration_cast<chrono::milliseconds>(endTime - beginTime);
        cout << "v1:Algorithm elapsed time is " << elapsedTime.count() << " milliseconds" << endl;
    
        beginTime = chrono::high_resolution_clock::now();
        for(int i = 0; i < LEN; i++ )
        {
          min = v2[i];
          for(int j = i; j < LEN; j++ )
          {
            if(v2[j]<min)
            {
              min= v2[j];
              v2[j]=v2[i];
              v2[i]=min;
            }
          }
        }
    
        endTime = chrono::high_resolution_clock::now();
        elapsedTime= chrono::duration_cast<chrono::milliseconds>(endTime - beginTime);
        cout << "v2:Algorithm elapsed time is " << elapsedTime.count() << " milliseconds" << endl;
        // For debug
        // for( int i = 0; i != LEN; ++i )
        // {
        //     cout<<v1[i]<<v2[i]<<endl;
        // }
    
        cin.get();
        return 0;
    }

输出结果:

D:\ws\alg_compare\build>main.exe
v1:Algorithm elapsed time is 2 milliseconds
v2:Algorithm elapsed time is 185 milliseconds
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,570评论 0赞 1
  • 上篇文章回顾: 小王职场记 谈谈你的STL理解(1) std:sort代码解析 开始 首先看一段视频。https:...
    跟着小义学AI阅读 1,019评论 0赞 0
  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 4,500评论 0赞 9
  • 亲子日记第33天 相博超妈妈 今天上午在开发区高中听了金辉校长的一次有关家庭教育的讲座,听了以后感觉在对孩子的教...
    一年级四班相博超妈妈阅读 883评论 0赞 1
  • 敏感的人都特别懂事 只要稍微给点暗示 就能读懂背后的意思 所以从不会让别人感到为难 只会为难自己 我还是喜欢我自己...
    月亮都被我吃了阅读 421评论 1赞 2

友情链接更多精彩内容