堆排序:Swift实现

概述

堆排序(heapsort)具有空间原址性,任何时候只需要常数个额外的元素空间存储临时数据。整个算法的时间复杂度是O(nlgn)

堆性质

1)近似的完全二叉树

2)

PARENT(i) 
    return floor(i/2)

LEFT(i)
    return 2i

RIGHT(i)
    return 2i+1

3)最大堆 A[PARENT(i)] >= A[i]

4)最小堆 A[PARENT(i)] <= A[i]

堆应用

  • 最大堆常用于构造优先队列

堆的几个基本操作

  • MAX-HEAPIFY 时间复杂度O(lgn),维护最大堆性质函数
  • BUILD-MAX-HEAP 线性时间复杂度 将源数组数据最大堆化
  • HEAPSORT 时间复杂度O(nlgn),对原数组进行原址排序
  • MAX-HEAP-INSERT 时间复杂度O(lgn)
  • HEAP-EXTRACT-MAX 时间复杂度O(lgn)
  • HEAP-INCREASE-KEY 时间复杂度O(lgn)
  • HEAP-MAXIMUM 时间复杂度O(lgn)

堆性质维护

MAX-HEAPIFY的作用是保证i结点为根节点的子树遵循最大堆的性质

伪代码如下:

MAX-HEAPIFY(A, i)

l = LEFT(i)
r = RIGHT(i)

if l <= A.heap-size and A[l] > A[i]
    largest = l
else largest = i

if r <= A.heap-size and A[r] > A[largest]
    largest = r

if largest != i
    exchange A[i] with A[largest]
    MAX-HEAPIFY(A, largest)

建堆

续。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值