概念:利用树结构进行排序。
分类:1、大顶堆: 每个小树的根节点都大于子节点 升序排序使用大顶堆
2、小顶堆:每个小树的子节点都大于根节点 降序排序使用小顶堆
1 public class HeapSort { 2 3 public static void main(String[] args){ 4 int[] arr=new int[]{9,6,7,0,1,10,4,2}; 5 System.out.println(Arrays.toString(arr)); 6 heapSort(arr); 7 System.out.println(Arrays.toString(arr)); 8 } 9 10 public static void heapSort(int[] arr){ 11 //开始位置是最后一个非叶子节点,即最后一个节点的父节点 12 int start=(arr.length-1)/2; 13 //调整为大顶堆 14 for(int i=start;i>=0;i--){ 15 maxHeap(arr,arr.length,i); 16 } 17 //先把数组中的第0个和堆中最后一个数交换位置,再把前面的处理为 大顶堆 18 for(int i=arr.length-1;i>0;i--){ 19 int temp=arr[0]; 20 arr[0]=arr[i]; 21 arr[i]=temp; 22 maxHeap(arr,i,0); 23 } 24 } 25 26 // size:数组在后面依次先前遍历 当前节点 27 public static void maxHeap(int[] arr,int size,int index){ 28 //左子节点 29 int leftNode=2*index+1; 30 //右子节点 31 int rightNode=2*index+2; 32 int max=index; 33 //和两个子节点分别对比,找出最大的节点 34 if(leftNode<size&&arr[leftNode]>arr[max]){ 35 max=leftNode; 36 } 37 if(rightNode<size&&arr[rightNode]>arr[max]){ 38 max=rightNode; 39 } 40 //交换位置 41 if(max!=index){ 42 int temp=arr[index]; 43 arr[index]=arr[max]; 44 arr[max]=temp; 45 //交换位置以后,可能会破坏之前排好的堆,所以, 46 maxHeap(arr,size,max); 47 } 48 49 50 } 51 } 52