程序
public class HeapSort{
public static void main(String[] args){
int[] arr = {1,3,5,3,0,8,6,9,2,7,8};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
//堆的构建包括两个步骤:1.交换 2.调整
private static void heapSort(int[] arr){
//从第一个非叶子节点开始调整
for(int i = arr.length/2-1;i >= 0;i--){
adjustHeap(arr,i,arr.length);
}
for(int j = arr.length-1;j>0;j--){
swap(arr,0,j);//在无序区中,将末尾元素与堆顶元素进行交换
adjustHeap(arr,0,j);//再次调整,形成有序区
}
}
/**
* 交换元素
* @param arr
* @param t 堆顶元素
* @param b 无序区末尾元素
*/
private static void swap(int[] arr,int t,int b){
int temp = arr[t];
arr[t]=arr[b];
arr[b]=temp;
}
/**
* 堆的调整
* @param arr
* @param i 当前节点
* @param length 调整范围(无序区)
*/
private static void adjustHeap(int[] arr,int i,int length){
int temp = arr[i];//初始父节点
for(int k=2*i+1;k<length;k=2*i+1){
if(arr[k+1]>arr[k]){//若是右孩子更大,就作为调整对象
k++;
}
if(arr[k]>temp){//若是孩子值更大,就复制给初始的父节点
arr[i]=arr[k];
i=k;//向下一层进行调整
}else{
break;
}
}
arr[i]=temp;
}
}
测试结果
[0, 1, 2, 3, 3, 5, 6, 7, 8, 8, 9]
tips:在关键的位置sysout一下,方便你理解
给我的影响
通过比较,不断推选当前无序区域中最大的节点于堆顶,
再通过交换,让末尾区开始有序,
重复上面的操作,直至全部有序。
声明
非本人的程序,参考他人程序实现,加上自己的注解。
参考:堆排序Java实现原版
更详细内容,看这个大哥的,有动图演示 数据结构十大经典算法