堆排序(Heapsort )是利用堆这种数据结构所设计的一种排序算法。

06堆排序.mp4

堆的概念

堆是具有以下性质的完全二叉树∶

  1. 1. 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
  2. 1. 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:

image.png
我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子

0 1 2 3 4 5 6 7 8 9
17 15 12 8 6 11 4 2 7 5

对于某1个节点i,它的父节点(i-1)/2
对于某1个节点i,它的左孩子2i+1
对于某1个节点i,它的右孩子2
i+2

堆排序的思路

(1)根据初始数组去构造初始堆。
(2)每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下元素重新调整为大根堆,再进行交换第一个元素和最后一个元素,再调整大顶堆,重复执行,直到整个数组排序完成。

建堆的过程∶

现在我们有一个无序数组:27,46,12,33,49,27,36,40,42,50,51,我们先把它建成完成二叉树,然后从最后一个非叶子结点开始,从右至左,从下至上进行调整,将它调整成大顶堆。

最后一个非叶子结点的下标:(arr.length-1-1)/2 = arr.length/2-1
image.png
image.png

堆排序的过程:

将堆顶元素与末尾元素交换,将最大元素”沉”到数组末端,调整堆结构(heapify),使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复操作,直到堆里只剩下1个元素。

例如∶将堆顶元素与末尾元素交换,即51和27交换,51”沉”到数组末端。
image.png
对剩余元素调整堆结构得到:
image.png
继续将堆顶元素与末尾元素交换,即50和27交换,50”沉”到数组倒数第2的位置。
image.png
以此类推,继续调整堆结构,继续交换堆顶和堆尾元素,直到堆里只剩下1个元素,整个堆排序完成。