堆排序算法_______没有完成

堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是一个不稳定性的排序

准备

的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆

大根堆&&小根堆

性质:每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。如下图
堆排序算法_______没有完成
我们对上面的图中每个数都进行了标记,上面的结构映射成数组就变成了下面这个样子
堆排序算法_______没有完成
还有一个基本概念:查找数组中某个数的父结点和左右孩子结点,比如已知索引为i的数,那么

  • 父结点索引:(i-1)/2(这里计算机中的除以2,省略掉小数)
  • 左孩子索引:2*i+1
  • 右孩子索引:2*i+2

所以上面两个数组可以脑补成堆结构,因为他们满足堆的定义性质:

  • 大根堆:arr(i)>arr(2i+1) && arr(i)>arr(2i+2)
  • 小根堆:arr(i)<arr(2i+1) && arr(i)<arr(2i+2)