public class HeapSort {
/**
* 堆排序中用来构建大根堆的方法
* @param array 待排序数组
* @param end 排序范围的终点
*/
private void maxHeap(int[] array, int end) {
//[1]根据数组的排序范围,计算出最后一个根节点的下标,计算公式:lastFather = (start + end) / 2 - 1,并且(start + end) / 2向下取整
int lastFather = (0 + end) % 2 == 0 ? (0 + end) / 2 - 1 : (0 + end) / 2;
//[3]创建一个循环,对数组中所有的根节点都进行如下操作
for(int father = lastFather; father >= 0; father--) {
//[2]使用每一个父节点的两个子节点先比较大小,然后用两个子节点中比较大的一个,和根节点比较大小,如果这个子节点比根节点还要大,则互换
/*
* 左右孩子节点下标和根节点下标之间的关系公式:
* leftChild = father * 2 + 1;
* rightChild = father * 2 + 2;
*/
int leftChild = father * 2 + 1;
int rightChild = father * 2 + 2;
//如果右孩子存在并且右孩子比父节点大,那么由右孩子替换父节点
if(rightChild <= end && array[rightChild] > array[father]) {
int tmp = array[rightChild];
array[rightChild] = array[father];
array[father] = tmp;
}
//如果左孩子比父节点大,那么由左孩子替换父节点,等价于左孩子比右孩子大,用右孩子替换原有的父节点
if(array[leftChild] > array[father]) {
int tmp = array[leftChild];
array[leftChild] = array[father];
array[father] = tmp;
}
}
}
/**
* 堆排序算法
* @param array 待排序数组
*/
public void heapSort(int[] array) {
//[3]创建一个循环,控制数组的待排序部分的最后下标位
for(int end = array.length-1; end > 0; end--) {
//[1]每次都是自顶向下构建大根堆
maxHeap(array, end);
//[2]将大根堆的堆顶元素和数组待排序范围内的最后一个元素进行互换
int tmp = array[0];
array[0] = array[end];
array[end] = tmp;
}
}
public static void main(String[] args) {
int[] array = new int[] {7,0,1,9,2,6,3,8,5,4};
HeapSort hs = new HeapSort();
hs.heapSort(array);
System.out.println(Arrays.toString(array));
}
}
堆排序:java代码实现
最新推荐文章于 2024-07-18 11:42:31 发布