对于不同的算法,其有不同的时间复杂度和空间复杂度,并且稳定性也不一样。其总结如下:
从上面可以看出,不同的排序算法具有不同的特性。再选择使用的时候也应该根据自己的实际需求来进行选择。
例子
我们拿C语言中的qsort()函数来举例。 再该函数中对一个数组进行排序的时候,它会先判断数组所占用的内存多大,如果只是KB范围的大小,它将会使用归并排序,因为归并排序的时间复杂度一直为O(nlog n),虽然空间复杂度为O(n),但是KB范围的空间,可以不用计算。对于快排,因为时间复杂度存在不稳定性,由于可能退化。所以会选择归并排序。而当排序数据的容量非常大时,我们这时使用快速排序,为了防止快排的时间复杂度退化,它选择使用了三数取中的办法,来减少时间复杂度退化的情况。另外为了防止快排在递归过程中栈的溢出,因此它选择使用了栈的数据结构来模拟栈的调用。另外,当比较的元素小于等于4个的时候,他就会使用插入排序来进行排序。虽然插入排序的时间复杂度为O(n2),但是这是当数据进行线性增长时的变化规则,如果数据的量非常小,插入排序的效率并不会比快排和归并排序慢(可以参考 y = x2和 y=x log x的曲线图)。
所以综上,任何一个实际应用的排序算法,都不可能只是单单的一种排序算法实现的,在其中他还会加入大量的优化,以及在不同情况下选择不同的排序算法来解决问题。对于普通的排序算法的熟练掌握,可以更好的理解并结合不同的排序算法。,