换一种更清晰的写法:
package 算法;
//堆排序
//三个核心方法:构建大顶堆;调整堆;交换数据
public class Demo8{
// 交换数据
public static void change(int[] arr,int a,int b){
int temp1=arr[a];
arr[a]=arr[b];
arr[b]=temp1;
}
//调整堆
public static void adjustHeap1(int[] arr,int start,int end){
//三个参数:调整数列,调整首位置,调整尾位置
int child;//子节点
int temp2=arr[start];
for(child=start*2+1;child<end;child=child*2+1){
if(child<end-1 && arr[child]<arr[child+1]){
child=child+1;
}
if(temp2>=arr[child]){
break;
}
arr[start]=arr[child];
start=child;
}
arr[start]=temp2;
}
//构建大顶堆
public static int[] buildHeap1(int[] arr){
int len=arr.length;
for(int i=len/2;i>=0;i--){
adjustHeap1(arr, i, len);
}
return arr;
}
//堆排序
public static void sortHeap1(int[] arr){
arr=buildHeap1(arr);
for(int le=arr.length-1;le>0;le--){
change(arr, 0, le);
adjustHeap1(arr, 0, le);
}
}
//测试方法:
public static void main(String[] args){//测试方法
int arr[]={7,4,8,3,5,2,1,6,10,27,12,23};
// System.out.println(arr);
arr=buildHeap1(arr);
System.out.print(" 构建的大顶堆是:");
for(int i=0;i<arr.length;i++){//逐项输出
System.out.print(arr[i]+" ");
}
sortHeap1(arr);
System.out.print(" 堆排序结果:");
for(int i=0;i<arr.length;i++){//逐项输出
System.out.print(arr[i]+" ");
}
}
}
程序运行结果:
构建的大顶堆是:27 12 23 10 7 8 1 6 3 5 4 2 堆排序结果:1 2 3 4 5 6 7 8 10 12 23 27