C++之STL中sort函数的内部实现(一)

概述

STL中提供了一个sort()函数,用于排序。它的实现虽然是基于我们熟悉的quick sort, insertion sort, heap sort,但是内部却庞大复杂。sort()函数只能接受RandomAccessIterators,list slist都不能使用。
STL中的sort()函数在数据量大的时候采用quick sort,分段后的数据量小于某一个门槛时便采用insertion sort。

Insertion Sort

之所以采用insertion sort,是因为当划分的数据量小于某一个门槛或者待排序的序列接近有序的时候,insertion sort虽然时间复杂度是O(n^2),但是仍然比quick sort好。

void __insertion_sort(RAIterator first, RASIterator last){
    if(first == last) return;
    for(RAIterator i = first + 1; i != last; ++i)
        __linear_insert(first, i, value_type(first));
}
inline void __linear_insert(RAIterator first, RAIterator last, T*){
    T value = *last;
    if(value < *first){
        整个取件向又移动一个位置;
        *first = value;
    }
    else
        __unguarded_linear_insert(last, value);
}
void __unguarded_linear_insert(RAIterator last, T value){
    RAIterator next = last;
    --next;
    while(value < *next){//不用判定边界,因为肯定能找到value正确的落脚处。
        *last = *next;   //这一点在上面的函数中可以保证。
        last = next;
        --next;
    }
    *last = value;
}

Quick Sort

quick sort 大家都很熟悉,平均时间复杂度是O(n log n),最坏时间复杂度O(n^2)。

算法:

  1. 如果序列中元素个数为0或者1,结束;
  2. 选取序列中某个元素,当做枢轴(pivot)v;
  3. 将序列划分为L和R两段,L内的元素都小于等于v,R中的元素都大于等于v;
  4. 对L和R递归执行quick sort。

Median-of-Three(三点中值)

任何一个元素都可以被选做枢轴,比如随机选取,固定选取。但是划分的两端越均匀,执行效率越高;如果其中一段长度为0,那就出现了最坏情况。最理想的选取方法是选取头、尾和中间三个元素中大小处于中间的那个元素作为枢轴。这样可以避免出现最坏情况。

你可能感兴趣的:(面试题,C++)