无风无影

   ::  :: 新随笔  ::  ::  :: 管理
 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 }
View Code

 初始化建堆过程时间:O(n)

调堆的时间复杂度为O(logn)

堆排序的时间复杂度为:O(nlogn)

因为堆排序是就地排序,空间复杂度为常数:O(1)

posted on 2018-05-28 00:01  NWNS-无风无影  阅读(126)  评论(0)    收藏  举报