[Data Structure & Algorithm] 选择排序

基本思想

  • 经过比较,将最小的记录与最前面的记录交换位置。
    • 最前面的记录 - 第一次是第一位,第二次是第二位,以此类推

直接选择排序

  • 基本思想
    1.从第一个记录开始逐个比较,将指针指向最小的记录,直到比较完最后一个记录
    2.将最小的记录和最前面的记录交换位置
    3.再次循环从第二个记录开始比较,将第二小的记录交换到第二位,依次进行,直到所有记录排序完成
  • 优点 - 移动记录的次数较少
    • 最好情况 - 正序 - 无需移动
    • 最坏情况 - 逆序 - n-1次交换,每次交换移动3次
  • 缺点 - 比较记录的次数较多 - n*(n-1)/2
  • 时间复杂度 - O(n2)

树形选择排序(锦标赛排序)

  • 基本思想
    • 第一轮排序,把所有记录作为树的最后一层,两两分组(如果共有奇数个记录,则最后补上∞),取其中较小的记录作为倒数第二层
    • 依次类推,最终得到的根结点即为这一轮中的最小值
    • 第二轮排序,将上一轮中的最小值用∞表示,重新构造树,新的根结点即为这一轮的最小值
  • 优点 - 比较次数相对直接选择较小
  • 缺点
    • 比较次数中包括多次与∞的比较
    • 需要额外的空间
  • 时间复杂度 - O(nlog2n)

堆排序(优先队列)

  • 二叉堆
    • 性质
      • 完全二叉树
      • 所有非叶子结点都不大于其左、右孩子结点
    • 表示 - 数组
      • 对于数组中元素Array[i],他的左孩子是Array[2i],右孩子是Array[2i+1],父节点是Array[i/2]
    • 操作
      • 插入 Insert - 上滤
        1.找到最后一个非叶子结点,即最后一个叶子结点的父节点Array[n/2]
        2.以这个结点为根结点,与其左右孩子比较,将最小值调整为根结点
        3.继续调整与这个结点在同一层的其他结点
        4.这层调整完后,向上一层进行比较,此时如果有交换,需要注意交换后的结点是否会影响其作为根结点的堆结构
      • 删除最小值 DeleteMin - 下滤
        1.将最后一个叶子结点与根结点交换,得到新的根结点
        2.将现在的根结点与其左右孩子比较,把较小的值交换到根结点
        3.如果有交换,则这个孩子的子树的堆结构可能被破坏,重复2,直到最后一层的叶子结点
  • 基本思想
    1.构造二叉堆
    2.DeleteMin
  • 优点
    • 空间上 - 只需要一个额外空间进行交换
    • 时间上
      • 最坏情况 - O(nlog2n)

猜你喜欢

转载自www.cnblogs.com/break-dawnn/p/9873334.html
今日推荐