算法导论 系列二:排序

  • 完全二叉树实现:节点i的左子2i,右子2i+1,父节点i/2
    • build_max_heap 复杂度O(n)
    • heap_sort 复杂度O(nlgn)n取最小
    • inset extract_max max_heap 复杂度均为O(n)
  • 保持堆性质(递归下调)
  • 建堆:O(n)次 调用 max_heap复杂为O(lgn)准确上界为O(n)
  • 直接构造堆时间复杂度为O(n), 插入构造堆复杂度为O(nlgn)

优先级队列

  • 内部由堆实现
    • 抽取最大值

堆操作分析

  • 建堆:从n/2至0调用求最大,调整位置使得根最大
  • 插入:直接插入数组尾部,递归向上调整,保持堆性质
  • 删除最值:直接交换根和尾值。缩小空间(-1),递归向下调整保持堆性质
  • 优先队列操作间接调用堆操作
  • k路归并,构建k路小根堆,每次取最小值,复杂度O(nlgk)

快排

  • 找出pivit,以pivot为轴心做一次partition,分割成两个子集,对子集递归调用快排
  • partiiton过程

  • 快排性能分析:划分极端不对称时,复杂度退化为O(n^2)序列有序时性能退化最严重
  • 随机化版本:随机选取pivot
  • 利用随机化版本,快排期望时间复杂度为O(nlgn)

线性时间排序

  • 计数排序
    • n个输入元素每一个都介于0~k之间,且k=O(n)
    • 对每一个输入的元素x都直接确定出比x小的元素的个数,则可以直接将其放入排序后的位置
    • 倒序插入是为了保证稳定性,即值相同元素的插入顺序与排序前顺序保持一致
  • 基数排序
    • 先按低位排序,然后递归的的向高位排序
    • 复杂度O(d(n+k))
  • 桶排序
    • 输入均匀分布时,可以达到线性时间复杂度
    • 桶内以插入排序实现
    • θ(n) + n*O(2-1/n) = θ(n)
  • 中位数
    • 随机选择算法:平均情况下,顺序统计量可在O(n)复杂度内得到,最坏时间复杂度为O(n^2)
    • 最坏时间复杂度为O(n)的顺序统计量
    • pivot 的选择以中位数的中位数来衡量,保证避免最坏划分(组划分size>=5的奇数个,都可以保证线性时间复杂度)
    • select 方法嵌入快排的partition,可以使得快排的最坏时间复杂度为O(nlgn)
    • 任意序列的O(n)算法
    • 寻找两个已排序数组 (长度均为n)的中位数
    • 找出已排序的前i个最大数
      • 排序,输出前i个数,复杂度θ(nlgn)
      • 建立优先队列,输出i次最大值θ(n+ilgn)
      • 顺序统计量量找出第i大元素,然后以第i大元素作为pivot进行partition,将partiton结果排序 θ(n +ilgi)
      • 顺序读入元素,维护一个i个元素的大根堆,依次输出堆中元素。复杂度 θ(nlgi)
posted @ 2016-12-23 21:53  zeroArn  阅读(218)  评论(0编辑  收藏  举报