1 import java.util.Arrays; 2 3 publicclass HeapSort { 4 inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; 5 public HeapSort(){ 6 heapSort(a); 7 } 8 9 public void heapSort(int[] a){ 10 System.out.println("開始排序"); 11 int arrayLength=a.length; 12 //循環建堆 13 for(int i=0;i<arrayLength-1;i++){ 14 //建堆 15 buildMaxHeap(a,arrayLength-1-i); 16 //交換堆頂和最後一個元素 17 swap(a,0,arrayLength-1-i); 18 System.out.println(Arrays.toString(a)); 19 } 20 } 21 22 23 24 private void swap(int[] data, int i, int j) { 25 // TODO Auto-generated method stub 26 int tmp=data[i]; 27 data[i]=data[j]; 28 data[j]=tmp; 29 } 30 31 //對data數組從0到lastIndex建大頂堆 32 privatevoid buildMaxHeap(int[] data, int lastIndex) { 33 // TODO Auto-generated method stub 34 //從lastIndex處節點(最後一個節點)的父節點開始 35 36 for(int i=(lastIndex-1)/2;i>=0;i--){ 37 //k保存正在判斷的節點 38 int k=i; 39 //如果當前k節點的子節點存在 40 while(k*2+1<=lastIndex){ 41 //k節點的左子節點的索引 42 int biggerIndex=2*k+1; 43 //如果biggerIndex小於lastIndex,即biggerIndex+1代表的k節點的右子節點存在 44 if(biggerIndex<lastIndex){ 45 //若果右子節點的值較大 46 if(data[biggerIndex]<data[biggerIndex+1]){ 47 //biggerIndex總是記錄較大子節點的索引 48 biggerIndex++; 49 } 50 } 51 52 //如果k節點的值小於其較大的子節點的值 53 if(data[k]<data[biggerIndex]){ 54 //交換他們 55 swap(data,k,biggerIndex); 56 //將biggerIndex賦予k,開始while循環的下一次循環,重新保證k節點的值大於其左右子節點的值 57 k=biggerIndex; 58 }else{ 59 break; 60 } 61 } 62 } 63 } 64 }
原文:http://www.cnblogs.com/kanchihong/p/6250725.html