关于sort,一篇就够

本文详细介绍了STL sort算法,包括其概念、适用场景、底层思想,如快速排序与插入排序的结合,以及SGI STL sort的源码分析,强调了在特定情况下的优化策略,如三点中值选择和内省式排序。
摘要由CSDN通过智能技术生成

    
• 概念


        STL sort有SGI和RW两个版本,两者大同小异,本文讲解的是SGI版本,RW感兴趣自行了解。
    
        头文件:#include<algorithm>


        STL 所提供的各种算法中,sort()是最复杂、最庞大的一个。这个算法接受两个随机存取迭
代器(Random Access Iterators),然后将区间内的所有元素从小到大排序。


        这个算法有两个重载:
        ① 直接传入两个随机存取迭代器即可;
        ② 允许用户指定一个比较器(可以是仿函数、结构体、lambda表
        达式、函数指针),使得自定义类型也可以用sort()。



• 适用场景

        Sort() 第一个重载只适用于STL中的 vector、deque

        由于 STL 所有的关系型容器的底层结构是RB-tree,都拥有自动排序的功能。所以不需要sort()。
        至于序列式容器中的stack,queue都有特别的出口和入口,不允许用户对元素进行随意移动。
        而vector、deque和list,因为list的迭代器属于双向移动迭器(Bidirectioinal Iterator),slist的迭代器属于单向移动迭代器(Forward iterator),所以都不适用sort()算法。
        vector、deque的迭代器属于Random Access Iterator,适用sort算法。



• 底层思想

        sort算法大致思想为,在数据量大时采用Quick Sort,分段递归排序。一旦分段后的数据量
小于某个门槛,为了避免Quick Sort递归的层数过多,就改用Insertion Sort。如果递归层数过深,
还会改用Heap Sort。

        Insertion Sort算法的时间复杂度虽然为O(N^2),但是当数据量很少时࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值