排序算法一览表
如何选择合适地排序算法
- 线性排序时间复杂度很低,但是其使用场景特殊。因此,如果要写一个通用的排序函数,不能选择线性排序;
- 为了兼容任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数;
- 同为时间复杂度为O(nlogn)的排序算法,选择快排而不选择归并排序是,因为归并排序不是原地排序算法;
如何优化快速排序
- 三数取中法:从区间的首、尾、中分别取一个数,取中间值作为分区点;如果排序规模太大,三数取中已经不够了,就要改为5数取中甚至10数取中;
- 随机法:每次从要排的区间随机取出一个数值作为分区点;
- 警惕快排递归堆栈溢出由两种解决方法:a.限制递归深度,一旦超过深度阈值,就停止递归;b.在堆上模拟实现一个函数调用栈,手动实现递归压栈、出栈过程,这样就没有系统栈大小限制;
通用排序函数实现技巧
- 数据量不大时,可以采用空间换时间的思路;
- 数据量大时,优化快排分区点的选取;
- 防止堆栈溢出,可以选择在堆上手动模拟调用栈解决;
- 当元素小于某个常数时,可以考虑使用O(n^2)复杂度排序算法;
- 用哨兵简化代码,每次排序都减少一次判断;
《数据结构与算法之美》 -- 王争