堆排序算法的基本步骤:
(1)将无序序列构建成一个堆,再根据需求构建成大根堆或小根堆(此处以大根堆为例);
(2)此时的堆顶元素即为最大元素,将其与堆最末的元素交换,沉到数组末端(即不会再参与调整);
(3)交换之后重新调整堆为大根堆。
(4)重复步骤(2)(3)直到整个序列有序。
import java.util.Arrays;
public class HeapSort {
public static void sort(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);
}
}
public static void adjustHeap(int[] arr,int i,int length){
int temp=arr[i];
for(int k=i*2+1;k<length;k=k*2+1){
if(k+1<length && arr[k]<arr[k+1]){
k++;//指向更大的那一个
}
if(arr[k]>temp){
arr[i]=arr[k];
i = k;
}else{
break;
}
}
arr[i]=temp;
}
public static void swap(int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
public static void main(String[] args){
int[] arr={10,0};
sort(arr);
System.out.println(Arrays.toString(arr));
}
}