码迷,mamicode.com
首页 > 编程语言 > 详细

第6章 堆排序 java实现 最简版

时间:2015-10-13 20:49:34      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

只考虑int类型的排序,以后考虑泛型实现。

 1 public class Heap {
 2     
 3     public int heap_size;//在build_max_heap中初始化,由heap_sort自动调用
 4     
 5     public int parent(int i){
 6         return (i - 1) / 2;
 7     }
 8     public int left(int i){
 9         return 2 * i + 1;
10     }
11     public int right(int i){
12         return 2 * i + 2;
13     }
14     
15     /** 保持堆的性质,
16      * 假定left(i), right(i)为根的两根二叉树都是最大堆,
17      * A[i]可能小于其子女,这样就违背了最大堆性质
18      * 该函数让A[i]在最大堆中“下降”,使以i为根的子树成为最大堆
19      * */
20     public void max_heapify(int[] A, int i){
21         int l = left(i);
22         int r = right(i);
23         int largest;
24         // 从A[i] A[left(i)] A[right(i)] 中找出最大,下标存在largest中
25         // 若A[i]为最大,则根据假设,i为根的子树已是最大堆,函数结束
26         // 否则交换A[i]和A[largest],交换后下标为largest的节点值为A[i]
27         // 该节点的子树可能违反最大堆,因此对largest下标递归调用
28         if(l < heap_size && A[l] > A[i]){
29             largest = l;
30         } 
31         else{
32             largest = i;
33         }    
34         if(r < heap_size && A[r] > A[largest]){
35             largest = r;
36         }
37         if(largest != i){
38             int tmp = A[i];
39             A[i] = A[largest];
40             A[largest] = tmp;
41             
42             max_heapify(A, largest);
43         }
44     }
45     
46     /**
47      * 建堆
48      * 自底向上将数组A[1..n](此处n=length[A])变成最大堆
49      * 子数组A[(floor(n / 2) + 1) .. n]中的元素都是树中的叶子
50      * 所以对每一个非叶子节点都调用一次该过程
51      * */
52     public void build_max_heap(int[] A){
53         heap_size = A.length; // 初始化heap_size
54         for(int i = (heap_size/2 - 1); i > -1; --i){
55             max_heapify(A, i);
56         }
57     }
58     
59     /**
60      * 堆排序算法
61      * 先建造最大堆,根A[1]即为最大,则置换到数组的正确位置A[n]
62      * 从堆中去掉节点n,A[1..n-1]建成最大堆,但新根可能违背了最大堆性质,
63      * 此时调用max_heapify(A,1)可以保持该性质,在A[1..n-1]构造出最大堆。
64      * 不断重复,堆大小从n-1降到2
65      * */
66     public void heapsort(int[] A){
67         build_max_heap(A);
68         for(int i = A.length-1; i > 0; --i){
69             int tmp = A[0];
70             A[0] = A[i];
71             A[i] = tmp;
72             --heap_size;
73             max_heapify(A, 0);
74         }
75     }
76     
77     public static void show_array(int[] A){
78         for(int i = 0; i < A.length; ++i){
79             System.out.print(A[i] + ". ");
80         }
81         System.out.println();
82     }
83     
84     public static void main(String[] args){
85         int[] A = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
86         
87 88 System.out.println("before heapsort:"); 89 show_array(A); 90 91 Heap h = new Heap(); 92 h.heapsort(A); 93 94 System.out.println("after heapsort:"); 95 show_array(A); 96 97 } 98 99 }

 运行结果:

技术分享

第6章 堆排序 java实现 最简版

标签:

原文地址:http://www.cnblogs.com/tobebrave/p/4875521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!