码迷,mamicode.com
首页 > 其他好文 > 详细

堆排序

时间:2014-07-22 23:16:35      阅读:404      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

堆排序算法的时间复杂度为O(nlgn).在堆排序算法中,我们使用的是最大堆。

mamicode.com,码迷

(1)初始时候,堆排序算法利用BUILD-MAX-HEAP将输入数组A[1..n]建成最大堆。

此时堆的根结点是最大元素,且该元素位于数组A[1]。

接着将A[1]与A[n]互换,则可以将A[1..n]中的最大值置于A[n]。

(2)从堆中删除结点n,即使A[n]不再参与后面的计算。

剩余结点中,其他结点没有改变,因此还是最大堆形式,而新替换的

根结点可能会违背最大堆的性质。所以执行MAX-HEAPIFY(A,1)算法,从而在A[1..n-1]上构造一个新的最大堆。

然后将将A[1]与A[n-1]互换,则可以将A[1..n-1]中的最大值置于A[n-1]。

(3)然后堆排序算法会不断重复过程(2)

,直到堆的大小由n-1变成2.

下面给出伪代码

mamicode.com,码迷

mamicode.com,码迷

mamicode.com,码迷

 

下面给出示例代码

mamicode.com,码迷
 1 package codeforgod;
 2 
 3 /**
 4  * @author gejing gjblmdlm@sina.com
 5  * @version 创建时间:2014年4月29日 下午12:43:30 类说明 :堆排序
 6  */
 7 public class HeapSortDemo {
 8     int heapSize; // 堆元素个数
 9 
10     /**
11      * 堆排序
12      * 
13      * @param a
14      */
15     public void heapSort(int[] a) {
16         buildMaxHeap(a);
17         for (int i = a.length - 1; i > 0; i--) {
18             int temp = a[0];
19             a[0] = a[i];
20             a[i] = temp;
21             heapSize--;
22             maxHeapify(a, 0);
23         }
24 
25     }
26 
27     /**
28      * 建立最大堆
29      * 
30      * @param a
31      */
32     private void buildMaxHeap(int[] a) {
33         heapSize = a.length;
34         for (int i = a.length / 2 - 1; i >= 0; i--) {
35             maxHeapify(a, i);
36         }
37 
38     }
39 
40     /**
41      * 最大堆化
42      * 
43      * @param a
44      * @param i
45      */
46     private void maxHeapify(int[] a, int i) {
47         int l = 2 * (i + 1) - 1; // 左孩子下标
48         int r = 2 * (i + 1);// 右孩子下标
49         int largest = i;
50         if (l < heapSize && a[l] > a[i]) {
51             largest = l;
52         }
53         if (r < heapSize && a[r] > a[largest]) {
54             largest = r;
55         }
56         if (largest != i) {
57             int temp = a[i];
58             a[i] = a[largest];
59             a[largest] = temp;
60 
61             maxHeapify(a, largest);
62         }
63 
64     }
65 
66     public static void main(String[] args) {
67         HeapSortDemo hs = new HeapSortDemo(); // 实例化一个对象
68         int A[] = { 5, 9, 13, 6, 2, 7, 30, 23, 17, 10 };
69         System.out.print("原始序列: ");
70         for (int i : A) {
71             System.out.print(i + "\t");
72         }
73         hs.heapSort(A); // 调用方法进行排序
74         System.out.println();
75         System.out.print("堆排序后: ");
76         for (int i : A) {
77             System.out.print(i + "\t");
78         }
79     }
80 }
View Code

 

堆排序,码迷,mamicode.com

堆排序

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/blmdlm/p/3699769.html

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