• 排序概述


    写在之前

    声明,本篇只限内部排序讨论。本来想叫概论的,想想算法概论那本书,归归,且称排序概述吧。

    排序算法,恐怕是很多求职的程序员都会复习的东西,网上的资料也很多,本篇只讨论一些简单的问题。

    找结论的看这里

    懒得画了,放上见得最多的分类图。

    以及它们的复杂度:

     

    排序常见问题

    一般岗位的话,可能知道这些排序的时间复杂度就差不多了。如果是算法或者后端,没准会问得多一点。比如说,最坏最好情况什么时候出现?空间复杂度是多少?排序是否为稳定排序?

    最好最坏情况以及复杂度因算法而异,详细内容见后续章节,先说排序稳定性问题,先说排序的稳定性。

    • 什么样的排序叫稳定排序?

    原始输入中,两个值相等的元素经过排序算法排序之后,它们之间的相对顺序不变。这样的排序算法就叫稳定排序。比如说输入[51, 6,  52 , 4, 3, 53],排序之后若为[3,4,51,   5, 53,6]即为稳定排序。

    • 稳定排序有什么用?

    举个例子,高考分数排名,正常来说分数越高排名越靠前,那如果分数相同呢?不知道其他地方是怎么规定的,至少安徽这边,理科按数学分高的在前,如果数学分再一样就看理综,理综一样再看下一门科。好的,简化一下,分数高者排名高,分数相同看数学分数。现在对所有理科考生按照数学分数排序,此时输出的是按照数学分数排序的得分记录。然后再按照总分进行排序,如果第二次排序算法不稳定,虽然输出的总分排序是OK的,但是之前输入的得分记录之间的相对顺序变了。也就是说,相同得分且数学分高的得分记录,可能跑到相同得分但数学分较低的记录后面去了。这样的排序是不满足需求的。

    简而言之,最终排序结果如果是按照多个不同优先级键综合排序输出,那么不稳定排序算法就不适用。

    • 怎么样判断排序算法是否稳定?

    除了基数排序(桶排序)之外,上面罗列出来的排序算法都是比较排序。比较排序,通过比较元素之间的大小关系,交换元素位置。像冒泡排序就是稳定排序,选择排序也是稳定排序。而常用的快排、归并排序、堆排序都不是稳定排序。鄙人总结的是,如果排序是依次比较,也即没有出现跳过中间元素比较 就 直接交换的排序就是稳定排序算法。反之,如快排,一趟排序的最后一步将最终位置元素和第一个元素(先设为第一个元素)直接交换,最终位置元素就跳过了中间位置的比较,所以可能出现不稳定的情况。

    另外多说一句,比较排序的平均复杂度最快是O(nlg n),这是经过数学证明的。

  • 相关阅读:
    (5.1.4)引擎管理——SSMS管理使用小技巧
    (5.1.3)引擎管理——恢复系统数据库
    Kafka 基本原理
    读懂基础机器学习算法
    数据挖掘常用工具
    Oracle 增加修改删除字段
    .net中使用ODP.net访问Oracle数据库(无客户端部署方法)
    数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法
    ORACLE存储过程学习
    js版扫雷(可直接运行试玩)
  • 原文地址:https://www.cnblogs.com/ustcwx/p/8064136.html
Copyright © 2020-2023  润新知