堆排序的时间复杂度的一些理解

本文探讨了堆排序中swim和sink操作的时间复杂度。相较于swim操作的时间复杂度O(N*logN),sink操作的时间复杂度为O(N)。通过详细分析两个操作的过程,解释了为何在堆排序中更倾向于使用sink操作,以及在数组和链表中堆排序效率的差异。
摘要由CSDN通过智能技术生成

我之前一直有这样的疑问:

        为什么我们在使用数组中堆排序的时候一般都采用sink即下沉操作而非swim操作呢?

一经查阅相关知识,了解到:swim操作的时间复杂度(将一个数组排序的时间复杂度)为

O(N*logN),而sink操作的时间复杂度(将一个数组排序的时间复杂度)为O(N)。

        那么问题来了,为什么同为堆排序的手段,二者的时间复杂度却相差这么大呢?

我们来逐个分析:

swim操作:

        我们知道,在一个结点数大小为N的二叉树中,其二叉树的高度为log(N+1),于是

我们有一种堆排序的方法就是从左至右遍历数组,并用一个size指针(索引)维护已经

排好序的二叉树(这里的排好序是指大二叉树的一部分在size大小的小数组中是排好序的二叉树)

然后我们每次将size指针的后一个元素加入size的小数组中,并扩大size的规模加1,这样定型

去分析每个元素,我们不难发现,一个元素去往它应该去的地方需要两个操作,一是比较,

二是交换;因为一个二叉树的高度最高为log(N+1),我们又要将N个元素全部归位,故

swim操作的时间复杂度就是NlogN了;

sink操作:

        sink操作的思想就是当一个结点(叶结点除外)的两个子堆都为有序的话,那么在这个结点

上再次调用sink函数就能把以这个结点为父节点的二叉树变成一个堆

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值