堆排序比较难,需要理解堆调整的过程。
import java.util.*;
class HeapSort {
public static void main(String[] args) {
//System.out.println("Hello World!");
int[] arr=new int[]{9,1,7,6,5,4,3,2,8};
heapSort(arr);
disp(arr);
}
//调整为大顶堆
public static void maxHeap(int[] arr,int parentIndex,int size){
int maxIndex=parentIndex;
int leftIndex=2*parentIndex+1;
int rightIndex=2*parentIndex+2;
if(leftIndex<size&&arr[maxIndex]<arr[leftIndex]){
maxIndex=leftIndex;
}
if(rightIndex<size&&arr[maxIndex]<arr[rightIndex]){
maxIndex=rightIndex;
}
if(maxIndex!=parentIndex){
int temp=arr[parentIndex];
arr[parentIndex]=arr[maxIndex];
arr[maxIndex]=temp;
//交换之后可能会破坏原来的子树,maxIndex
maxHeap(arr,maxIndex,size);
}
}
public static void buildMaxHeap(int[] arr){
int parentIndex=arr.length/2-1;
for(int i=parentIndex;i>=0;i--){
maxHeap(arr,i,arr.length);
}
}
public static void heapSort(int[] arr){
//int parentIndex=arr.length/2-1;
buildMaxHeap(arr);
for(int i=arr.length-1;i>0;i--){
int temp=arr[0];
arr[0]=arr[i];
arr[i]=temp;
maxHeap(arr,0,i);
}
}
public static void disp(int[] arr){
System.out.println(Arrays.toString(arr));
}
}