要求:从小到大排序
思路:先将数组构建成大顶堆, 然后依次“删除”顶部元素 到末尾
/**
* “下沉”操作 ,如果构建大顶堆,将小的下沉;如果构建小顶堆,将大的下沉;这里是将小的下沉
* 由于从底部开始调整,,下面的已经是大顶堆了
* @param array 待调整的数组(堆)
* @param parentIndex 父节点
* @param lastIndex 最大位置
*/
public static void downAdjust(int[] array,int parentIndex,int lastIndex){
// 保存父节点的值,用于进行最后的替换你
int tmp=array[parentIndex];
// 获取子节点位置
int biggerChildIndex=2*parentIndex+1;
while (biggerChildIndex<=lastIndex){
// 看一下左右子节点那个更大,将biggerChildIndex指向更大那个
if(biggerChildIndex+1<lastIndex&&array[biggerChildIndex+1]>array[biggerChildIndex]){
biggerChildIndex++;
}
// 看一下父节点是否需要下沉
if(tmp>=array[biggerChildIndex]){
// 如果父节点较大,说明已经是大顶堆,跳出循环,不需要调整
break;
}
// 大的上浮
array[parentIndex]=array[biggerChildIndex];
// 继续往下调整,更新指标
parentIndex=biggerChildIndex;
biggerChildIndex=2*parentIndex+1;
}
// 进行最后的替换
array[parentIndex]=tmp;
}
/**
* 进行堆排序
* @param array 待排序的数组
*/
public static void heapSort(int [] array){
// 先将数组构建成大顶堆
int lastIndex=array.length-1;
// 从下往上调整
for(int i=(lastIndex-1)/2;i>=0;i--){
downAdjust(array,i,lastIndex);
}
// 进行堆排序 -- 不断将大顶堆的顶部 “删除”,不断换新的最大元素上来
for(int curLastIndex=array.length-1;curLastIndex>0;curLastIndex--){
// 将当前最大的顶部元素取出来
int tmp=array[curLastIndex];
array[curLastIndex]=array[0];
array[0]=tmp;
// 调整堆,获取新的大顶堆
downAdjust(array,0,curLastIndex-1);
}
}
来源:https://blog.csdn.net/zzzfffei/article/details/100540416