数据结构定义和算法--排序--优化

排序算法一览表

数据结构定义和算法--排序--优化

如何选择合适地排序算法

  1. 线性排序时间复杂度很低,但是其使用场景特殊。因此,如果要写一个通用的排序函数,不能选择线性排序;
  2. 为了兼容任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数;
  3. 同为时间复杂度为O(nlogn)的排序算法,选择快排而不选择归并排序是,因为归并排序不是原地排序算法;

如何优化快速排序

  1. 三数取中法:从区间的首、尾、中分别取一个数,取中间值作为分区点;如果排序规模太大,三数取中已经不够了,就要改为5数取中甚至10数取中;
  2. 随机法:每次从要排的区间随机取出一个数值作为分区点;
  3. 警惕快排递归堆栈溢出由两种解决方法:a.限制递归深度,一旦超过深度阈值,就停止递归;b.在堆上模拟实现一个函数调用栈,手动实现递归压栈、出栈过程,这样就没有系统栈大小限制;

通用排序函数实现技巧

  1. 数据量不大时,可以采用空间换时间的思路;
  2. 数据量大时,优化快排分区点的选取;
  3. 防止堆栈溢出,可以选择在堆上手动模拟调用栈解决;
  4. 当元素小于某个常数时,可以考虑使用O(n^2)复杂度排序算法;
  5. 用哨兵简化代码,每次排序都减少一次判断;