排序优化
在C++的STL中为我们提供了很多排序函数如sort、stable_sort等等,平时我们也会直接使用这些现成的排序函数,为了让我们更加深层的了解底层的排序函数,现在我们从如何实现一个通用的、高性能的排序函数这个问题出发,进而更加全面的理解排序算法。
https://pan.baidu.com/s/1izhWFEqCNhi2LK3MApk6ng?pwd=n4xy
线性排序算法的时间复杂度比较低,适用场景比较特殊。所以如果要写一个通用的排序函数,不能选择线性排序算法。如果对于小规模数据进行排序,可以选择时间复杂度是O(n²)的算法;如果对大规模数据进行排序,时间复杂度是O(nlogn)的算法更加高效。所以,为了兼顾任意规模数据的排序,一般都会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。
时间复杂度是O(nlogn)的排序算法不止一个,我们已经知道的有归并排序、快速排序,后面还会了解一种叫堆排序的排序算法。其中堆排序和快速排序都有比较多的应用,比如Java语言采用堆排序实现排序函数,而C++中采用了快排实现排序函数(后面我们会具体讲解)。
但是我们发现,貌似同样时间复杂度为O(nlogn)的归并排序却不经常被使用,这是因为归并排序并不是原地排序算法,它的空间复杂度为O(n)。所以说,当我们在为数据量比较大的文件排序时,除了数据本身占用的内存之外,我们还需要额外占用很大内存空间,所需的空间耗费就翻倍了。因此,考虑到空