<pre name="code" class="java">package heapSort; /** * 大根堆 * @author root * */ public class HeapSort { static int[] data = {0,9,4,6,2,5}; static int[] data1 = {0,2,4,5,3,1,7,6}; public static void main(String[] args) { // TODO Auto-generated method stub sort(data1); print(data1); } //堆排序 public static void sort(int[] data){ int length = data.length-1; //建立大根堆,从最后一个孩子节点开始,依次向下调整 for(int i=length/2; i>0; --i){ heapAjdust1(data, i, length); } //排序(每次将堆顶放到后面,然后调整堆) for(int i=length; i>1; --i){ int t = data[1]; data[1] = data[i]; data[i] = t; heapAjdust1(data, 1, i-1); } } //向下调整(课本上的) public static void heapAjdust(int[] data, int s, int m){ int temp = data[s]; for(int j=2*s; j<=m; j*=2){ if((j+1)<=m && data[j]<data[j+1]) j++; if(data[s]>=data[j]) break; data[s] = data[j]; s=j; } data[s] = temp; } /** * 向下调整(自己改写的),大于孩子节点则跳出,否则与较大孩子交换,继续向下调整 * @param data * @param s 需要向下调整的节点序号 * @param m 最后一个节点序号 */ public static void heapAjdust1(int[] data, int s, int m){ for(int j=2*s; j<=m; j*=2){//从s的子节点开始,一直到最后一个节点 //取较大节点 if((j+1)<=m && data[j]<data[j+1])//有有右节点,并且左节点小于右节点 j++; if(data[s]>=data[j])//s节点值大于较大节点,则s节点比其所有子孙都大,结束 break; int t = data[s];//s小于孩子,将s与孩子交换 data[s] = data[j]; data[j] = t; s=j;//s转到孩子节点上,继续与孩子比较 } } public static void print(int[] data){ for(int i=1; i<data.length; i++){ System.out.println(data[i]); } } }