排序算法——堆排序

堆排序

堆排序是通过这种特殊的数据结构进行排序的一种排序算法。

堆:由完全二叉树构成,且具有一定的大小关系;二叉树根为最小值的堆被称为小顶堆,反之,根节点为最大元素的堆被称为大顶堆
对于一个堆,按层进行编号,根节点为0号,依次往下编号,对应于一个序列(集合)的下标。
堆的两个重要性质:
1、结点i的父节点为i/2
2、结点i的左子节点为2i,右子节点为2i+1

堆排序的基本思想是:设给待排序列构造成一个大顶堆(升序大顶堆、降序小顶堆),堆顶元素与最后一个元素交换,即把待排序列中的最大值放到最后一个位置。剩下的元素仍然构成一个堆,继续构造成为大顶堆,交换倒数第二个数······,直到堆只剩一个元素。

堆排序算法的时间复杂度为O(nlogn)

伪代码

HEAPSORT(A)
	BUILD_MAX_HEAP(A)
	for i = A.length downto 2
		exchange A[1] and A[i]
		A.heap_size=A.heap_size-1
		MAX_HEAPIFY(A,1)

伪代码出自《算法导论》原书第3版,机械工业出版社,Thomas H.Cormen Charles E.Leiserson著

若存在序列:{7, 50, 1, 4, 32, 7, 9, 5, 25, 6},利用堆排序进行排序。
1、构造堆
在这里插入图片描述
2、构造出大顶堆
(方法一:时间复杂度nlogn
在这里插入图片描述
(方法二:时间复杂度n
在这里插入图片描述
(两种方法构造的大顶堆有所不同,但最终排序结果是一样的。接下去的步骤采用第一种方法。)

3、将堆顶的50与最后一个元素6交换,50已排好;
4、剩下的元素构造大顶堆。得到堆顶元素32,与最后一个元素4交换,32已排好;
5、重复第4步的操作,直至排序完成。

在这里插入图片描述

以上gif制作均来源于VisuAlgo https://visualgo.net/zh/sorting

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值