排序算法相必大家都见过很多种,例如快速排序、归并排序、冒泡排序等等。今天,我们就来简单讲讲堆排序。
在上一篇中,我们讲解了二叉堆,今天的堆排序算法主要就是依赖于二叉堆来完成的,不清楚二叉堆是什么鬼的,可以看下:
用辅助数组来实现堆排序算法
假如给你一个二叉堆,根据二叉堆的特性,你会怎么使用二叉堆来实现堆排序呢?
我们都知道,二叉堆有一个很特殊的节点 —- 堆顶,堆顶要嘛是所有节点的最大元素,要嘛是最小元素,这主要取决于这个二叉堆是最小堆还是最大堆。
今天,我们暂且选择以最小堆来作为例子。
基于堆顶这个特点,我们就可以来实现我们的堆排序了。
大家看下面一个例子:
对于一个如图有10个节点元素的二叉堆:
我们把堆顶这个节点删除,然后把删除的节点放在一个辅助数组help里。
显然,这个被删除的节点,是堆中最小的节点。接下来,我们继续删除二叉堆的堆顶,然后把删除的元素还是存放在help数组里。
显然,第二次删除的节点,是原始二叉堆中的第二小节点。
继续删除
继续连续6次删除堆顶,把删除的节点一次放入help数组。
二叉堆中只剩最后一个节点了,这个节点同时也是原始二叉堆中的最大节点,把这个节点继续删除了,还是放入help数组里。
此时,二叉堆的元素被删除光了,观察一下help数组。这是一个有序的数组,实际上,通过从二叉堆的堆顶逐个取出最小值,存放在另一个辅助的数组里,当二叉堆被取光之时,我们就完成了一次堆排序了。
其实无需辅助数组
在上面的堆排序过程中,我们使用了一个辅助数组help。可事实上,我们真的需要辅助数组吗?
上篇讲二叉堆的时候,我们说过。二叉堆在实现的时候,是采取数组的形式来存储的。
从二叉堆中删除一个元素,为了充分利用空间,其实我们是可以把删除的元素直接存放在二叉堆的最后一个元素那里的。例如:
删除堆顶,把删除的元素放在最后一个元素。
继续删除,把删除的元素放在最后第二个位置
继续删除,把删除的元素放在最后第三个位置
