本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程
如何实现一个通用的、高性能的排序函数?
如何选择合适的排序算法?
如果要实现一个通用的、高效率的排序函数,我们应该选择哪种排序算法?我们先回顾一下前面讲过的几种排序算法。
我们前面讲过的,线性排序的时间复杂度较低,适用场景比较特殊,所以如果写一个通用的排序函数,不能选择线性排序算法。
如果对小规模进行排序,可以选择时间复杂度是O(n^2)的算法;如果对大规模的数据进行排序,时间复杂度是O(nlogn)的算法更加高效。所以,为了兼顾任意规模的数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。
时间复杂度是O(nlogn)的排序算法不止一个,我们已经讲过的有归并排序、快速排序,后面讲堆的时候,还会讲到堆排序。堆排序和快速排序都有比较多的应用,比如Java语言采用堆排序来实现排序函数,C语言使用快速排序实现排序函数。
快速排序比较适合实现排序函数,但是,我们也知道,快速排序在最坏情况下时间复杂度是O(n^2)如何来解决这个“复杂度恶化”的问题呢?
如何优化快速排序?
前面讲过,快速排序,每次分区点都选择最后一个数据。如果数据原来就是有序的或者接近有序,那时间复杂度就退化为O(n^2)。为了提高排序算法的性能,我们也要尽可能的让每次分区都比较平均。
这里介绍两个比较常用、比较简单的分区算法,你可以直观的感受下。
1、三数取中法
我们从区间的首、尾、中间,分别取出一个娄,然后比大小,取这3数的中间值作为分区点。但是,如果要排序的数组比较大,那“三娄取中”可能就不够了,可能要“五数取中”或者“十数取中”。
2、随机法
随机法就是每次从要排序