堆排序
堆排序是基于选择排序的排序算法,相对于选择排序来说更加高级,效率也高,因为使用了基于完全二叉树的最大堆或者最小堆结构,想要输出结果是升序的就用最大堆,反之则用最小堆。最大堆就是完全二叉树中所有的非叶子节点的值都大于或者等于其孩子结点的值。所以利用这种结构,我们每一次都将最大堆堆顶元素(最大)和堆底元素做交换,然后将堆的大小减一,调整新堆的结构使其符合最大堆的定义,然后递归去交换堆顶元素和堆底元素的值即可,最后就能够得到已经排好序的数列。
java代码如下:
1 | /** |
由上述代码可见,堆排序的时间复杂度为(nlogn)因为,交换的复杂度是n,而重建堆结构的复杂度是logn,而每次交换以后都要重建堆结构,所以是nlogn。空间复杂度为o(1),因为只有一个temp值用来在交换时暂存值。