几种经典排序算法的比较

对于时间复杂度来说,快速排序的速度比较快。

一般系统级别的排序都是使用快速排序。对于有可能出现大量重复元素的情况,我们可以使用三路的快速排序。


 

归并排序必须开辟额外的空间完成归并的过程,才能完成归并排序。

快速排序虽然是在原地完成的排序,但它仍然需要log2n个额外空间。

这是因为我们在使用递归的方式来实现快速排序,需要分成log2n层,相应地有log2n层栈空间来保存每一次递归时的临时变量,以供递归返回时继续使用。

同样地,归并也是用递归来实现的,所以它的额外空间应该是O(n+log2n),只不过n要比log2n大得多,所以就我们只关注它的额外空间是O(n)级别的。


 

排序算法的稳定性 Stable:对于相等的元素,在排序后,原来靠前的元素依然靠前。相等元素的相对位置没有发生改变

一些稳定的算法如果实现不好的话依然可能会实现成不稳定的程序。

同时我们还可以使用自定义比较函数,让排序算法不存在稳定性的问题。(其实也就是多比较了一下,相应的会有一些性能损耗)

例如:(在C++中)

bool operator<(const Student& otherStudent){
        
    return score != otherStudent.score ?
               score > otherStudent.score : 
          name < otherStudent.name;

在上表中,我们通常在一个系统级别的排序问题中选择一个稳定的排序算法时,选择归并排序

posted @ 2018-03-15 16:13  小杜同学的嘚啵嘚  阅读(584)  评论(0编辑  收藏  举报