本文主要说明代码编写思路和具体代码,下面的博文讲的比较全面
参考文章:https://www.cnblogs.com/jingmoxukong/p/4303826.html
代码思路(以大根堆为例)
堆排一共分2个阶段:1. 创建一个大根堆 2.交换堆顶和堆尾元素,获取到堆顶元素,并重新维护大根堆
第一个阶段的思路:
从最后一个非叶子节点
开始,自下而上的维护一个大根堆,包括两步:
1. 选出当前节点及其左右孩子节点中的较大者,并交换位置到当前堆顶
2. 若进行了交换,则需要向下维护交换过的下级堆(下图的红色节点的情况,需要再跟下方的绿色节点交换位置)
第二个阶段的思路:
1.交换堆顶和堆尾元素 2.然后自顶向下的重新维护堆
然后重复这两步,每次大根堆的规模-1
代码实现
public class HeapSort {public static void swapHeap(int[] array, int current, int size){//左右孩子indexint leftCIndex = current * 2 + 1, rightCIndex = current * 2 + 2;//最终堆顶位置元素index 可能不变 可能变为left或right 供后续交换位置使用int heapIndex = current;if(rightCIndex < size && array[rightCIndex] > array[heapIndex]){heapIndex = rightCIndex;}if(leftCIndex < size && array[leftCIndex] > array[heapIndex]){heapIndex = leftCIndex;}//发生过交换,则需要维护下级堆if(heapIndex != current){Util.swap(heapIndex,current,array);swapHeap(array,heapIndex,size);}}public static void main(String[] args) {int[] array = {1, 3, 4, 5, 2, 6, 9, 7, 8, 0};//创建大根堆for(int i = array.length / 2 ; i >= 0 ; i--){swapHeap(array,i,array.length);}//开始排序for(int i = array.length - 1; i > 0 ; i--){Util.swap(i,0,array);swapHeap(array,0,i);}//排序结束后array中元素已经是升序排列的了}
}