堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的值总是小于(或者大于)它的父节点。
算法步骤
将初始待排序列 (R1,R2,…,Rn) 构建成大顶堆,此堆为初始的无序区;
将堆顶元素 R1 与最后一个元素 Rn 交换,此时得到新的无序区 (R1,R2,…,Rn−1) 和新的有序区 Rn, 且满足 Ri⩽Rn(i∈1,2,…,n−1);
由于交换后新的堆顶 R1 可能违反堆的性质,因此需要对当前无序区 (R1,R2,…,Rn−1) 调整为新堆,然后再次将 R1 与无序区最后一个元素交换,得到新的无序区 (R1,R2,…,Rn−2) 和新的有序区 (Rn−1,Rn)。不断重复此过程直到有序区的元素个数为 n−1,则整个排序过程完成。
图解算法
HeapSort
代码实现
算法分析
稳定性:不稳定
时间复杂度:最佳:O(nlogn), 最差:O(nlogn), 平均:O(nlogn)
空间复杂度:O(1)