• 常用排序算法总结对比


    常用排序算法总结对比

    在这里插入图片描述


    每博一文案

    有许多人告诉我们,前方有美丽的风景,却没有一个人能代替我们走过
    这茫茫的夜路。在这个光怪陆离的人间,没有谁可以将日子过得行云流水,
    那些历经劫数,尝遍百味的人都明白一个道理:不期盼别人,踏实而务实
    让自己的生活简单而真实,我们遇到的所有难题都是为了让我们变得更加强大。
    风雨过后,终会迎来彩虹,当那时,万物终将明朗,一切皆如你意。
                                        ——————   一禅心灵庙语
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6


    各大排序的比较

    排序算法平均时间复杂度最好的情况最坏的情况空间复杂度排序方式稳定性
    冒泡排序O(n2)O(n)o(n2)O(1)In-place稳定
    选择排序O(n2)O(n2)O(n2)O(1)In-place不稳定
    插入排序O(n2)O(n)O(n2)O(1)In-place稳定
    希尔排序O(n log n)O(n log2 n)O(n log2 n)O(1)In-place不稳定
    归并排序O(n log n)O(n log n)O(n log n)O(n)Out-place稳定
    快速排序O(n log n)O(n log n)O(n log n)O(log n)In -place不稳定
    堆排序O(n log n)O(n log n)O( n log n)O(1)in-place不稳定
    计数排序O(n + k)O(n + k)O(n + k)O(k)Out-place稳定
    桶排序O(n + k)O(n + k)O(n2)O(n + k)Out-place稳定
    基数排序O(n * k)O(n * k)O(n * k)O(n + k)Out-place稳定

    相关术语解释:

    • 稳定: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则为 稳定 ,如:如果 a 原本在序列中 b 的前面,而当 a = b ,排序后,a 仍然在 b 的前面,则表示稳定 ; 如果排序后,a 不在 b 的前面了,则表示 不稳定注意: 这里所谓的 前面:指的是,只需要在前面就可以了,不需要前面多少位。
    • 不稳定: 如上述 稳定的描述,不满足稳定的定义。

    在这里插入图片描述


    排序的稳定性有什么有呢 ?? ?

    假设我们有这样一个场景:面试:10 个人笔试编程题,其中有两个人的分数都是 100 分 分别是 小华,小红的,但是,我们只能录用一个人。其中小华 比 小红 提前了 半个小时,先提交的答案。这时显而易见,我们是录用先提交的 小华了。而不稳定的排序算法,是无法保证提前交答案的小华,是排序在小红的前面的,因为数值都是 100,而 我们的稳定的排序算法是可以保证,提前交答案的小华一定是在小红的前面的。这里就体现了,排序算法中稳定性的价值所在。


    • 内排序(In-place) : 在排序的整个过程中,待排序的所有记录和操作都在内存中完成的。不可在磁盘中操作
    • 外排序(Out-place): 由于排序的数据量太大,主要存放在磁盘中,因此不能将全部数据放入到内存中,而是将一部分的数据从磁盘中读入到内存中,而整个排序过程需要通过磁盘和内存之间数据传输才能进行。该部分内容在 🔜🔜🔜 动静图结合详解: 归并排序 ,计数排序(归并排序思想扩展)那一块,会讲解的比较详细。大家可以移步,看看。
    • 时间复杂度: 一个算法执行时所耗费的时间,一般主要是指:最坏情况下执行的所耗费的时间
    • 空间复杂度: 运行完一个程序所需的内存大小,同样一般主要是指:最坏情况下的所耗费的空间
    • n : 数据量(数据规模)
    • k : 数据的个数
    • In-place: 不占用额外内存,内排序
    • Out-place: 占用额外的内存,外排序

    详细说明各大排序的稳定

    我个人不希望大家,是单单的记住死记硬背,而是可以理解其中的缘由,而排序的稳定性比较好讲解,有比较重要,所以多唠唠。

    冒泡排序稳定的 ,因为:我们两两比较时,我们可以通过修改算法,当数值相同时,不交换,这样,前面出现的相同的数值就不会出现在后面同样的是数值后面了。如下图所示:

    在这里插入图片描述


    选择排序是:不稳定的,可能存在,经过排序后,会改变相同数值的顺序。这时通过算法无法改变的。

    在这里插入图片描述


    插入排序是 稳定的 ,我们可以通过算法,将相同的数值,不改变其顺序,如下图:

    在这里插入图片描述


    希尔排序是 不稳定 的,因为预排序会打乱相同数值原本的顺序,相同的数值可能会分到不同的组中,进行排序,该现象无法通过算法改变。如下图:

    在这里插入图片描述


    堆排序是 不稳定 的,因为在堆排序中,升序,建大顶堆,后交换末尾元素 与 堆顶最大值,又重新建堆,这样的操作,改变了相同数值之间原来的前后顺序。如下图:

    在这里插入图片描述


    • 归并排序: 假设初始序列有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为 1 ,然后两两归并,得到 [n/2] (x 表示不小于 x 的最小整数) 个长度为 2 或 1 的有序子序列;再两两归并,…,如此重复,直至得到一个长度为 n 的有序序列为止。更详细的内容大家可以移步到 :🔜🔜🔜 动静图结合详解: 归并排序 ,计数排序_ChinaRainbowSea的博客-CSDN博客

    归并排序是 稳定 的,可以通过算法到达,相同数值之间原来的顺序不发生改变。如下图所示:

    在这里插入图片描述


    快速排序是 不稳定 的,取分界值,用于分界时,可能会改变相同数值之间原来的前后顺序。如下图:

    在这里插入图片描述


    计数排序是 稳定 的,通过依次统计序列出现的个数,原本顺序是如何就是,如何,相同的数值之间的顺序前后,不会发生改变。具体如下图:

    在这里插入图片描述


    • 基数排序: 依次分别取它们的 个位十位百位千位万位 … 排序好

    具体如下:动图如下:
    在这里插入图片描述


    1. 我们需要一个无序的序列,如下图:

    在这里插入图片描述

    1. 比较序列中 个位 上的数值排序,

    在这里插入图片描述

    1. 再根据排序好的个位 上的顺序,进行 十位 上的数值排序,数位上较短的数 前面补零

    在这里插入图片描述

    1. 最后基于上述的十位 排序好的顺序,再进行 百位 上的数值排序,因为该序列最高数值直到了百位,所以我们只需要排序到 百位 就整体有序了。数位上较短的数 前面补零
      在这里插入图片描述

    • 基数排序是对 传统桶排序 的扩展,速度很快
    • 是经典的空间换时间的方式,占用内存空间很大

    当数据量太大的时候,所耗费的额外空间较大,是原始数据的 10 倍空间

    • 基数排序是稳定的,相同的数,排序之后,他们的先后顺序没有发生变化。
    • 基数排序,无法对负数以及小数进行排序。

    最后:

    限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!


    在这里插入图片描述

  • 相关阅读:
    JavaScript面向对象和原型
    Bigemap在地质矿产行业的应用
    spring启动流程(二):包的扫描流程
    如何Maven部署、Maven项目导入使用【亲测有效简洁】
    javaweb--servlet
    Tomcat部署及优化
    搜狗收录量易语言查询代码
    Android SurfaceFlinger导读(04)理解BufferQueue
    unity的ui怎么显示在鼠标点击位置
    儿童三轮自行车外观及结构设计(lunwen+任务书+开题+文综+翻译及原文+三维模型)
  • 原文地址:https://blog.csdn.net/weixin_61635597/article/details/126694861