思想:
每个数组可以被看做是一个完全二叉树。
上面就是普通的二叉树,变成大根堆,大根堆的每个节点大于自己子节点。小根堆相反
然后将根堆的root放到数字的最后,再将n-1个节点大根排序。这样递归下去就是有序的数组了。
代码:
package Tree;
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(arr));
}
public static void heapSort(int[] arr) {
int index = (arr.length-2)/2;
for(int i =index;i>=0;i--) {
maxHeap(arr,arr.length,i);
}
//以上就是
for(int i=arr.length-1;i>=0;i--) {
int temp = arr[0];
arr[i] =arr[0];
arr[0] =temp;
maxHeap(arr,i,0);
}
}
public static void maxHeap(int[] arr,int size,int index) {
//判断当前节点是否小于子节点
int max = index;
int leftNode= 2*index+1;
if( leftNode<size && arr[leftNode] > arr[max]) {
max = leftNode;
}
int rightNode = 2*index+2;
if(rightNode<size && arr[rightNode] > arr[max]) {
max = rightNode;
}
if(index != max) {
int temp ;
temp = arr[index];
arr[index] = arr[max];
arr[max] = temp;
//交换之后检查当前节点是否小与子节点
maxHeap(arr,size,max);
}
}
}