代码实现:
快速排序的时间性能取决于快速排序递归的深度,可以用递归数来描述算法的执行情况。如果递归树是平衡的,那么此时的性能也是最好的。
也就是说,在最优的情况下,快速排序算法的时间复杂度为 O(nlogn)。
就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度log2n ,其空间复杂度也就为 O(logn) ,最坏情况,需要进行递归调用,其空间复杂度为 O(n),平均情况 空间复杂度也为 (logn)。
可惜的是 关键字的比较和交换是跳跃进行的,因此,快速排序是 种不稳
定的排序方法。
优化算法:
1、优化选取枢轴
三数取中,即取三个关键字先进行排序,将中间数作为枢轴, 一般是取左端、右端和中间三个数, 也可以随机选取。
对于非常大的待排序的序列来说还是不足以保证能够选择出一个好的pivo tkey, 因此还有个办法是所谓的九数取中,先从数组中分三次取样,每次取三个数,三个样品各取出中数,然后从这三个中数当中再取出一个中数作为枢轴 。
2、优化不必要的交换
3、优化小数组时的排序方案
快速排序适用于非常大的数组的解决办法, 那么相反的情况,如果数组非常小,其实快速排序反而不如直接插入排序来得更好(直接插入是简单排序中性能最好的)。其原因在于快速排序用到了递归操作,在大量数据排序时,这点性能影响相对于它的整体算法优势是可以忽略的,但如果数组只有几个记录需要排序时,这就成了大材小用,因此我们需要改进一下 QSort函数。
我们增加了一个判断, high-low不大于某个常数时(有资料认为7较合适,认为5更合理理,实际应用可适当调整) ,就用直接插入排序,这样就能保证最大化地利用两种排序的优势来完成排序。
4、优化递归操作
我们知道,递归对性能是有一定影响的, QSort 函数在其尾部有两次递归操作。
如果待排序的序列划分极端不平衡,递归深度将趋近与N ,而不是平衡时的 logN,就不仅仅是速度快慢的问题了,栈的大小是很有限的,每次递归调用都会耗费一定的空间 ,函数的参数越多,每次递归耗费的空间也越多。如果能减少递归,将会提高性能。我们对 QSort 实施尾递归优化。