 
1 package heapSort; 2 3 public class HeapSort { 4 5 public static void main(String[] args) { 6 int []array={101,11,16,8,22,1,33,55,5,99,88,33}; //数组本身就是一颗二叉树 7 heapSort(array); //调用堆排序方法 8 for(int i=0;i<array.length;i++){ 9 System.out.print(array[i]+" "); 10 } 11 12 } 13 private static void heapSort(int[] array){ 14 for(int i=(array.length-1)/2;i>=0;i--){ //从最后一个非叶子节点开始构建堆 15 buildHeap(array,i,array.length); 16 } 17 for(int i=array.length-1;i>0;i--){ //交换第一个和最后一个节点的位置,根节点肯定最大 18 int firstValue=array[0]; 19 array[0]=array[i]; 20 array[i]=firstValue; 21 buildHeap(array,0,i); //交换完成后重新构建剩余节点的树 22 } 23 } 24 private static void buildHeap(int[] array,int s,int length){ 25 26 while(2*s+1<length){ //当前节点存在子节点 27 int j=2*s+1; //获得左子节 28 if(j+1<length){//如果存在右节点,则获取左右最大的那个 29 if(array[j]<array[j+1]){ 30 j++; 31 } 32 } 33 if(array[s]<array[j]){ //交换父子节点位置 34 int svalue=array[s]; 35 array[s]=array[j]; 36 array[j]=svalue; 37 s=j; 38 }else{ 39 break; 40 } 41 } 42 } 43 44 45 46 }
初始化建堆过程时间:O(n)
调堆的时间复杂度为O(logn)
堆排序的时间复杂度为:O(nlogn)
因为堆排序是就地排序,空间复杂度为常数:O(1)
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号