堆排序及堆排序应用

目录

前言

堆排序

  思路

  向上调整生成堆

  向下调整生成堆

   排序

Topk问题

   what is topk

   思路

   代码实现


前言

现在给你一个无序数组,尝试用一种时间复杂度和空间复杂度尽可能小的方法,对该数组进行升序排序。

这个问题应该说我们在学习c语言的时候就遇到过,我们很容易想到冒泡排序法。冒泡排序法的时间复杂度是O(n^2),效率相对来说比较低今天我们讲述的堆排序可以很好的解决这个问题,把时间复杂度降到O(N*logN).同时给大家分享一下堆排序的一个应用---Topk问题。

堆排序

思路

1.首先我们要将数组变成一个堆的数据结构这里我们可以让数组的元素从前到后依次进行向上调整或者让数组的元素从后向前依次进行向下调整,经过以上操作我们可以得到一个堆。

2.我们接下来不断让堆顶元素跟最后一个元素交换(让最值放到后面),数组元素个数减去一,接着对元素个数减一的数组再进行调整,让它仍然是一个堆。重复以上操作。

经过上述操作后我们就可以对数组进行排序。

向上调整生成堆

下面我们来分析一下向上调整为小堆的方法。

我们知道向上调整需要深度小于该数据深度的数据构成一个小堆,那我们在遍历数据的时候就要从前到后来遍历这样可以一直保持小堆的状态。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值