快排基准点选择:
1、最原始的方式,选择列表第一个或最后一个的元素。当待排序列表之前是有序(正序或逆序)的时候,快排时间复杂度为O(n^2)
2、随机取基准点,能够部分避免1出现的情况,但是最坏情况下,依旧是O(n^2),即有序时,每次随机选的都是两端的元素。
3、三数取中取基准点,随机取三个数,用这三个数的中位数作为基准点,常用首尾元素+中间的值这三个数取中。这样能有效避免排序前有序的情况,时间复杂度稳定在O(nlogn)
快排优化:
1、当排序列表足够小时,使用插入排序代替快排,足够短时,插入排序平均更快一些;
2、一次分割时,把和基准点相等的值放在一起,不参与其它元素的排序。(荷兰国旗问题)
3、对函数尾部优化,把尾部最后一次的递归给优化掉,能将之前的堆栈深度由O(n)优化到O(logn)
4、使用并行或多线程(Python多线程是假的多线程,不可用)来处理各个子序列