堆排序是利用堆数据结构设计的一种排序算法,堆排序也是一种选择排序。
堆排序的思想是:
- 将待排序列构造成一个大顶堆,此时,整个序列整个序列的最大值就是大顶堆的根节点
- 将其与末尾元素进行交换,此时末尾就为最大值
- 然后将剩余n-1个元素重新构成一个堆,这样会得到n个元素的最小值
- 如此反复执行,便能得到一个有序的序列
//CODE实现过程
import java.util.Arrays;
public class ArrayResult {
public static void main(String[] args) {
//定义一个数组
int arr[] = {1,0,6,7,2,3,4,};
//调用调成大顶锥的方法
//定义开始调整的位置
int startIndex = (arr.length-1)/2;
//循环开始调整
for (int i =startIndex; i>=0; i--){
toMaxHeap(arr,arr.length,i);
}
//打印数组,看其是否调整成大顶锥结构
//System.out.println(Arrays.toString(arr)); //7,2,6,0,1,3,4
//经过上述操作之后,已经将数组调整成了一个大顶锥,
//然后还需要把根元素与最后一个元素进行调换
for (int i = arr.length-1; i>0; i--){
//循环中进行调换操作
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
//还完之后,再把剩余元素调成大顶锥
toMaxHeap(arr,i,0);
}
System.out.println("打印最后的排序结果:"+Arrays.toString(arr));
//最后结果为正确的升序排序
}
/**
* 定义大顶锥结构的方法
* @param arr 需要调整成大顶锥结构的数组
* @param size 需要调整的元素个数
* @param index 需要调整的元素开始位置
*/
private static void toMaxHeap(int[] arr, int size, int index) {
//获取左右字节的索引
int leftNodeIndex = index *2+1;
int rightNodeIndex = index *2+2;
//查找到最大节点所对应的索引下标
int maxIndex = index;
//然后同左右节点进行比较
//由于下面进行了递归调用,所以需要设置边界值,不然会出现ArrayIndexOutOfBoundsException
if (leftNodeIndex<size && arr[leftNodeIndex] > arr[maxIndex]){
maxIndex = leftNodeIndex;
}
if (rightNodeIndex<size && arr[rightNodeIndex] > arr[maxIndex]){
maxIndex = rightNodeIndex;
}
//进行位置的调换
if (maxIndex != index){
int temp = arr[maxIndex];
arr[maxIndex] = arr[index];
arr[index] = temp;
//调换完成之后,可能会影响到下面的子树不是大顶锥结构
//递归调用,再次进行调换
toMaxHeap(arr,size,maxIndex);
}
//这里完成了,完全二叉树调整成大顶锥的结构
}
}