- 首先构建一个大顶堆(升序),或者小顶堆(降序)。
- 将堆顶的元素放到数组的最后位置。
- 重新调整堆,保证是大顶堆或者小顶堆。
- 重复上面的操作。
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,9,8,5,3,2,4};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void heapSort(int[] arr) {
int len = arr.length;
buildHeap(arr,len);
for(int i=len-1;i>0;i
swap(arr,0,i);
len
heapify(arr,0,len);
}
}
public static void buildHeap(int[] arr ,int len){
for(int i=(len/2)-1;i>=0;i
heapify(arr,i,len);
}
}
public static void heapify(int[] arr ,int i ,int len){
int left = i*2+1;
int right = i*2+2;
int biggest = i;
if(left<len && arr[left]>arr[biggest]){
biggest=left;
}
if(right<len && arr[right]>arr[biggest]){
biggest=right;
}
if(biggest!=i){
swap(arr,biggest,i);
heapify(arr,biggest,len);
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}