java堆排_java语言实现堆排序

6在我的堆排序预备篇中,我已经给大家介绍了如何建立一个大根堆。那么在这一篇文章中我将给大家介绍堆排序。堆排序是时间复杂度为 O(N*LogN),额外空间复杂度为O(1)的一个算法。

堆排序的步骤:

1.先形成大根堆

2.将下标为最后的位置与下标为0(根节点)交换。

3.将交换后的堆大小减一,减一后的堆继续使它形成一个大根堆。

4.重复进行2,3操作,直到堆的大小减为1。

接下来我给大家分析一下上述步骤。

1.为什么形成大根堆并没有排好序呢?大家看看这种情况。

dbee164c913f6900b05c4bfb4d56edac.png

aaa2ae6c330754f7f76c18278a062135.png

并不是有序的。

2.为什么是将根节点与最后一个交换?

因为这个堆是大根堆,根节点的值肯定是这个数组的最大值。将它与最后一个位置交换然后堆减一(数组长度减一)就意味着最大的数肯定在数组最后。

dd250a5f5904b2eed666516e6b2cc3e5.png

f1d9e32c436035dc2daa23c1c8d77d72.png

然后只需将[0,arr.length-2]区间继续形成一个大根堆,我们称之为heapify的过程。

5e557ba6bfc22b30f38832de602c7583.png

445373fe7d54a98353de1bb48afbe7cb.png

接着重复2,3操作。继续将[0,arr.length-2]区间根节点和最后一个换位置。也就是5和3换。

b0ee061d0c752dd15fdb66a02c764388.png

是不是5又来到了正确位置呢?一直循环。这样就排好序了。这就是堆排序的过程。

接下来来看一下代码。

58301caf196f34162a078423e594c6b1.png

我们来分析一下代码。

5fd749f8e44c740e50d24035da371d1c.png

首先我们需要建立大根堆。heapInsert就是建立大根堆。将数组的每一个元素都放到大根堆。接着根节点与最后一个节点交换位置。然后进行重建大根堆,我们称之为heapify过程。接着重复这个过程直到size为1。

696aab96bd148c15ebc1a023b7fc6487.png

大根堆的建立过程我就不多讲了。在我的上一篇文章堆排序预备篇就给大家说得很清楚了。

bb0e3c3c12e12c4021554d4687390a3d.png

重新建立大根堆。首先index的左右两个孩子先PK一下找出左右孩子中较大的一个。这里就是largest。然后在和index比较,如果当前节点比左右孩子较大的一个还大。那么就不必调整。直接break结束循环。否则就把当前节点和较大节点交换。index来到左右孩子较大的那个位置。继续执行循环。

接着我们运行以下程序吧。

接着我们运行一下程序吧。

fb44de0261c1901ea22d94871d2ed639.png

排序成功。堆的结构很重要哦。以后要说的贪心算法其实就是利用了堆的结构。还有优先队列等等。这里堆排序就给大家介绍完了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值