将一个数组调整为最大堆.
根据堆的性质, 只要保证部分有序即可, 即根节点大于左右节点的值. 将数组抽象为一个完全二叉树, 所以只要从最后一个非叶子节点向前遍历每一个节点即可. 如果当前节点比左右子树节点都大, 则已经是一个最大堆, 否则将当前节点与左右节点较大的一个交换, 并且交换过之后依然要递归的查看子节点是否满足堆的性质, 不满足再往下调整. 如此即可完成数组的堆化.
package zuosuanfa; public class heapSort { public static void heapInsert(int []arr,int index ) { while(arr[index]>arr[(index-1)/2]){ swap(arr,index ,(index-1)/2); index = (index -1)/2; } } public static void heapify(int[]arr , int index ,int heapSize) { int left = (index *2 )+1; while(left<heapSize){ //判断边界 int largest = left+1 <heapSize&& arr[left]>arr[left+1]? left:left+1; largest=arr[index]>arr[largest]?index:largest; if(largest==index){ break; } swap(arr,largest,index); index = largest; left = (index*2)+1; } } public static void swap(int []arr,int i , int j) { int tem = arr[i]; arr[i]=arr[j]; arr[j]=tem; } }