zoukankan      html  css  js  c++  java
  • 排序概述

    写在之前

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

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

    找结论的看这里

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

    以及它们的复杂度:

     

    排序常见问题

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

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

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

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

    • 稳定排序有什么用?

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

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

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

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

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

  • 相关阅读:
    【转】Redis概念原理、redis面试
    mysql登录后显示用户名与当前数据库名
    (5.3.10)数据库迁移——sql server降级操作
    navicat下载安装破解
    sql server2016+windows server2016使用日志传送做主从,主库无法备份事务日志
    (4.41)sql server如何把xml转换成表格数据?
    .NET Core SDK在Windows系统安装后出现Failed to load the hostfxr.dll等问题的解决方法
    .NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程
    .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用
    [译]聊聊C#中的泛型的使用(新手勿入)
  • 原文地址:https://www.cnblogs.com/ustcwx/p/8064136.html
Copyright © 2011-2022 走看看