• 排序算法总结


    -------------------siwuxie095

       

       

       

       

       

       

       

       

    排序算法总结

       

       

      

    平均时间复杂度

    原地排序

    额外空间

    稳定排序

    插入排序(Insertion Sort)

    O(n^2)

    O(1)

    归并排序 (Merge Sort)

    O(n*lgn)

    ×

    O(n)

    快速排序(Quick Sort)

    O(n*lgn)

    O(lgn)

    ×

    堆排序(Heap Sort)

    O(n*lgn)

    O(1)

    ×

       

       

       

    1)平均时间复杂度

       

       

    1)插入排序在数组已经是有序的情况下,时间复杂度是 O(n) 级别的

       

       

    2)快速排序在极其特殊的情况下,将退化 O(n^2),可以采用随机

    的方式来处理,使得这种情况发生的可能性极其极其低

       

       

    3)总体而言,快速排序是更加快的一种排序算法

       

    对于归并排序、快速排序、堆排序 这三种 n*lgn 级别的排序算法来说,

    它们也有常数上的差异,而快速排序在这个常数上相对占优

       

    正因为如此,一般系统级别的排序都是使用快速排序来实现的,特别的,

    对于可能有大量重复键值的排序,可以使用三路快速排序

       

       

       

       

       

    2)原地排序

       

       

    归并排序必须开辟额外的空间来完成归并的过程,进而完成整个归并

    排序。所以,如果一个系统对空间相对比较敏感的话,归并排序可能

    就并不适合

       

       

       

       

       

    3)额外空间

       

       

    1)对于插入排序和堆排序来说,它们都可以通过在数组上直接交换元素

    来完成,所以它们所需要的额外空间是 O(1) 级别的,即 常数级别的一个

    空间

       

       

    2)而快速排序所需要的额外空间是 O(lgn) 级别的,这是因为快速排序是

    采用递归的方式来进行排序,递归的过程一共有 lgn 层,相应的就需要 lgn

    栈空间来保存每一次递归过程中的临时变量,以供递归返回的时候继续

    使用

       

       

    3)归并排序也可以通过递归来实现,因此归并排序所需要的额外空间是

    O(n)+O(lgn) 的,由于 lgn 比 n 小,lgn 可以忽略不计

       

       

       

       

       

    4)稳定排序

       

       

    稳定排序:对于相等的元素,在排序后,原来靠前的元素依然靠前。

    相等元素的相对位置没有发生改变

       

    所谓排序算法的稳定性是和具体实现相关的,也就是说,如果实现

    的不好的话,很有可能将插入排序和归并排序实现成了一个不稳定

    的排序算法

       

    另外,排序算法的稳定性可以通过自定义比较函数,使得排序算法

    不存在稳定性的问题

       

       

    如:现在就想使用快速排序,但是又要顾及稳定性,应该怎么做呢?

       

    以学生分数的排序为例,排序的主要键值是学生的分数,希望通过

    排序算法的稳定性,来使得相同分数的学生是按照姓氏的字典序来

    进行排列的

       

    bool operator<(const Student &otherStudent)

       

    {

       

    //在分数相同时,字母小的排在前面(即 字典序更靠前)

    return score != otherStudent.score ? score < otherStudent.score : name < otherStudent.name;

       

    }

       

       

    在判断两个学生之间的分数大小关系的时候,要先看他们的分数是

    不是相等,如果不等的话,就看分数就好了,如果相等的话,就看

    他们名字的字典序

       

    不难看出,在比较函数中,其实相当于多比较了一下,正因为如此,

    效率有所损耗,不过在一般情况下,由于使用现代的是计算机,这

    个效率的损耗,完全是可以承受的

       

       

    插入排序和归并排序都是稳定的排序算法,通常在系统级别的类库

    中,要实现实现一个稳定的排序,通常选择的是归并排序

       

       

       

       

       

    后记

       

       

    对于上面四个指标来说,每种排序,都各有优劣,各有侧重

       

    但是不是存在一种神秘的排序算法,使得上面四个指标都是最优呢?

       

    平均时间复杂度是 O(n*lgn) 级别的,且在有序的情况下还能降为

    O(n) 级别的,且对于任何情况下都不可能退化成 O(n^2) 级别,且

    是原地排序,且额外使用空间是 O(1),且是一个稳定的排序

       

       

    到现在(2017/6/6)为止,计算机科学家们,还没有发现这样一种

    排序算法。不过理论上,这种排序算法是存在的

       

       

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    SQL语句 基本查询
    NHibernate 映射基础(第三篇) 简单映射、联合主键
    NHibernate 数据查询之Linto to NHibernate (第八篇)
    NHibernate 组件基础 (第六篇)
    SQL Server聚合函数
    NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag>
    2020年10月笔记
    亚马逊云服务器aws配置ssl https证书
    namecheap mx记录配置邮箱
    为 PHPer 准备的 Go 入门知识
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6954278.html
Copyright © 2020-2023  润新知