首页 > 技术文章 > Heap_Sort

sirhuoshan 2013-12-05 20:31 原文

 1 public class Heap_Sort {
 2     
 3     public static void print(int[] a){
 4         for(int i : a){
 5             System.out.println(i);
 6         }
 7     }
 8     
 9     //调整堆为大根堆
10     public static void ajustTree(int[] a, int i , int len){
11         int max = i; //记录父节点和两个子节点中的最大者,默认为父节点
12         if(i <= len/2 ){ //如果不是叶子节点
13             if(2 * i + 1 <= len && a[max] < a[2 * i + 1]){//如果父节点小于左子节点
14                 max = 2 * i + 1;
15             }
16             if(2 * (i + 1) <= len && a[max] < a[2 * (i + 1)]){//如果较大的节点小于右子节点
17                 max = 2 * (i + 1);
18             }
19             if(max != i){ //如果节点发生了交换 重新调整堆 为大根堆
20                 int temp = a[i];
21                 a[i] = a[max];
22                 a[max] = temp;
23                 ajustTree(a, max, len);
24             }
25         }
26     }
27     
28     //进行排序
29     public static void sort(int[] a,int len){
30         int temp;
31         for(int i = len -1 ;i > 0 ;i--){//从最后一个叶子节点开始
32             temp = a[i];
33             a[i] = a[0];
34             a[0] = temp;
35             ajustTree(a ,0 ,i-1);//最后一个元素已有序 不需再调整
36         }
37     }
38     
39     
40     public static void main(String[] args){
41         int[] a = {4,1,6,3,8,2,10,5,9,11,7};
42         int len = a.length;
43         
44         //初始化堆为大根堆  从最后一个非叶子节点开始
45         for(int i = len/2 - 1; i >= 0; i--){
46             ajustTree(a, i ,len-1);
47         }
48         sort(a, len);
49         print(a);
50     }
51 }

 

推荐阅读