11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?

522 阅读3分钟

如何分析一个“排序算法”?

  • 为什么插入排序和冒泡排序时间复杂度都是O(n2),但是插入排序使用更多呢?

  • 排序算法的分析和评价

    • 排序算法的执行效率

      • 1.最好情况、最坏情况、平均情况(在什么样的原始数据下)

        • 为什么要区分不同情况
        • 方便对比
        • 在不同情况下,选择更适合场景的排序
      • 2.时间复杂度的系数、常数 、低阶

        • 对于排序集合数据较小的情况(10 个、100 个、1000 个),考虑系数等等
      • 3.比较次数和交换(或移动)次数

        • 排序中涉及大量 比较+交换+移动操作,考虑比较和交换次数
    • 排序算法的内存消耗

      • 原地排序:空间复杂度为O(1) 的排序算法
      • 冒泡,插入,选择都是原地排序算法
    • 排序算法的稳定性

      • 如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变\

      • 排序算法的时候需要注意

      • 为什么要考虑算法的稳定性

        • 时间有序的情况下,排序金额,如果算法不稳定,则会导致时间无序

\

冒泡排序

  • 核心思想:冒泡排序只会操作相邻的两个元素

  • 实现原理\

    • 每次冒泡比较相邻两个元素
    • 不满足大小关系则交换
    • 一次冒泡会将一个元素移动到应该在的位置,重复n次就完成了n个数据的排序工作(将最大|最小的元素排序到合适的位置上)
  • 冒泡排序的优化:当没有元素移动后,即可停止冒泡排序

  • 特性

    • 冒泡排序是原地排序算法
    • 当两个相同元素时不交换,保证稳定性
    • 冒泡排序时间复杂度:最好情况时间复杂度是 O(n)(有flag的情况下) 最坏时间复杂度O(n2)(逆序)平均时间复杂度O(n2)

\

\

插入排序

  • 核心思想:将一个数插入有序数组中,遍历数组找到合适位置即可

  • 实现原理

    • 将数组中的数据分为两个区间,已排序区间和未排序区间\

    • 在未排序中的区间中选择一个元素,插入到有序区间中(找到插入点后,需要将后面的元素移动一位)

    • 重复过程,直到未排序区间没有元素

  • 基本操作:比较+移动

  • 特点

    • 是原地排序算法

    • 是稳定排序算法

    • 时间复杂度 

      • 最好是时间复杂度为 O(n) 只比较一次即可(比较最大元素) 
      • 最坏时间复杂度为 O(n2) 
      • 平均时间复杂度为 O(n2)\

\

选择排序

  • 核心思想:分已排序区间和未排序区间,但是每次选择在未排序区间选择最小元素放入已排序区间的末尾

  • 特点:

    • 是原地排序算法

    • 选择排序的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为 O(n2)\

    • 不是稳定的排序算法,swap过程中会打乱稳定性

  • 优点不明显,缺点很明显

\

总结

  • 冒泡和插入的交换次数都是固定的

  • 操作:冒泡需要3个赋值操作,插入排序只需要1个  赋值操作更简单(时间更短)\

  • 对于O(n2) 时间复杂度的排序适合小规模数据

\

\