堆排序是基于大小堆来实现的,利用数组中左右子树的数学规律来进行构建最大树或者是最小树,在这基础上将最大数或者是最小树下沉,并将树的长度减1,直到树的长度为1,最后数组即为排序后的数组
场景:跟快排一样是一个O(nLogn)的算法,但是在堆排序中有较多次数的交换,所以总体来说,是比不上快排的,但是如果你需要的不是整个排序,而是最大或者是最小的一部分,那么堆排序就具有很大优势了
实现:
private static void heapSort(int[] arrays){
buildMaxHeap(arrays,arrays.length);
for(int i = arrays.length;i>1 ;i--){
swap(arrays,0,i-1);
adjustHeap(arrays,0,i-1);
}
}
/**
* 构建最大树
* */
private static void buildMaxHeap(int[] arrays ,int length){
for(int i = (length>>1)-1;i>=0 ;i--){
adjustHeap(arrays,i ,length);
}
}
/***
* 对数据的第i个节点进行比较,将左右子节点的最大值放到i节点,
* 如果发生交换,则需要对子节点的子树进行比较