/**
* 对指定结点进行heapIfy的方法
* @param tree 堆的数组
* @param i 对第几个结点进行heapIfy
*/publicstaticvoidheapIfy(int[] tree,int n,int i){if(i >= n){return;}int c1 =2* i +1;//根据指定结点 i 计算出孩子结点int c2 =2* i +2;//同上// 找出 i, c1, c2 中最大的放在父节点(就是heapIfy)int max = i;if(c1 < n -1&& tree[c1]> tree[max]){
max = c1;}if(c1 < n -1&& tree[c2]> tree[max]){
max = c2;}if(max != i){swap(tree, max, i);heapIfy(tree, n, max);}}/**
* 对整个数组进行建堆(从最后一个父节点开始heapIfy)
* @param tree
*/publicstaticvoidbuildHeap(int[] tree){int lastNode = tree.length -1;int parent =(lastNode -1)/2;for(int i = parent; i >=0; i--){heapIfy(tree, tree.length, i);}}/**
* 建堆之后,交换根结点和最后一个结点的位置,再对除最后一个根结点对剩余部分heapIfy
* @param tree
*/publicstaticvoidheapSort(int[] tree){buildHeap(tree);for(int i = tree.length -1; i >=0; i--){swap(tree, i,0);heapIfy(tree, i,0);}}@TestpublicvoidtestHeapIfy(){int[] tree =newint[]{5,1,2,4,10,3};heapSort(tree);for(int i =0; i < tree.length; i++){
System.out.println(tree[i]);}}
堆排序 /** * 对指定结点进行heapIfy的方法 * @param tree 堆的数组 * @param i 对第几个结点进行heapIfy */ public static void heapIfy(int[] tree, int n, int i) { if (i >= n) { return...