玉石电商网站建设方案,洛阳中企动力,图文广告开店培训班,做网站的一般要多钱C STL sort函数的底层实现 sort函数的底层用到的是内省式排序以及插入排序#xff0c;内省排序首先从快速排序开始#xff0c;当递归深度超过一定深度#xff08;深度为排序元素数量的对数值#xff09;后转为堆排序。
先来回顾一下以上提到的3中排序方法#xff1a;
快… C STL sort函数的底层实现 sort函数的底层用到的是内省式排序以及插入排序内省排序首先从快速排序开始当递归深度超过一定深度深度为排序元素数量的对数值后转为堆排序。
先来回顾一下以上提到的3中排序方法
快速排序先选一个基准值一般为首值将比它大的数置于其右侧将比它小的数置于它左侧那么这个基准值所在的位置定是整个数组的有序位。然后递归该基准左右两子数组。算法复杂度为nlogn堆排序将数组建立成大顶堆重复从堆顶取出数值最大的结点(把根结点和最后一个结点交换把交换后的最后一个结点移出堆移出的这个数值为未排序数组的最后)并让残余的堆维持大顶堆的性质。时间复杂度为nlogn插入排序对于未排序数据在已排序序列中从后向前扫描找到相应位置并插入。时间复杂度为n2;
其中先讲下快排和堆排快排的平均复杂度为nlogn但是它的复杂度是根据基准值来决定的基准值选择的不好最坏的复杂度会达到n2而堆排序的复杂度是一定的为n*logn那为什么不直接使用堆排序呢是因为在将堆顶值与最后一个结点值交换并移除最后一个值后在重新建堆的过程中交换到堆顶的值显然比每个结点要小但还是要经过对比判断这个判断其实是多余的因此这是它相比快排较慢的原因。
于是内省式排序结合了快排和堆排的特点当快速排序到大一定深度2logn时采用堆排序以维持n*logn的复杂度。
在sort函数中内省排序过程中子数组长度小于16时采用的是插入排序因为当数组长度较短时就是数组已经大致排序过了对大致有序的数组即逆序对不多了用插入排序的算法复杂度会很小可以想象成理牌的过程。