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

【算法导论】堆排序

时间:2015-01-05 23:09:50      阅读:390      评论:0      收藏:0      [点我收藏+]

标签:

(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。二叉堆可以分为两种形式:最大堆和最小堆。若将记录按从大到小排列,建“小”顶堆。若将记录按从小到大排,建“大”顶堆。

说明:在堆排序算法中,我们使用的是最大堆,最小堆通常用于构造优先队列。

算法分析:时间复杂度是O(nlogn)。堆排序属于原址排序:任何时候都只需要常数个额外的元素空间存储临时数据。堆排序是不稳定的排序算法。

 1 #include <stdio.h>
 2 #define LEFT(i)        2 * i
 3 #define RIGHT(i)    2 * i + 1
 4 
 5 void MaxHeapAjust(int A[], int i, int len)            //调整节点i满足最大堆性质
 6 {
 7     int l = LEFT(i);
 8     int r = RIGHT(i);
 9     int largest, tmp;
10 
11     if (l <= len && A[l - 1] > A[i - 1])
12     {
13         largest = l;
14     }
15     else
16     {
17         largest = i;
18     }
19     if (r <= len && A[r - 1] > A[largest - 1])
20     {
21         largest = r;
22     }
23 
24     if (i != largest)
25     {
26         tmp = A[i - 1];                        
27         A[i - 1] = A[largest - 1];
28         A[largest - 1] = tmp;
29 
30         MaxHeapAjust(A, largest, len);
31     }
32 }
33 
34 void BuildMaxHeap(int A[], int len)                    //构造最大堆
35 {
36     for (int i = len / 2; i > 0; i--)
37     {
38         MaxHeapAjust(A, i, len);
39     }
40 }
41 
42 void HeapSort(int A[], int len)                        //堆排序
43 {
44     int tmp;
45     BuildMaxHeap(A, len);
46     for (int i = len; i > 1; i--)
47     {
48         tmp = A[i - 1];
49         A[i - 1] = A[0];
50         A[0] = tmp;
51 
52         MaxHeapAjust(A, 1, i - 1);
53     }
54 }
55 
56 int main(void)
57 {
58     int A[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
59     HeapSort(A, 10);
60     for (int i = 0; i < 10; i++)
61     {
62         printf("%d ", A[i]);
63     }
64     printf("\n");
65 
66     return 0;
67 }

 

【算法导论】堆排序

标签:

原文地址:http://www.cnblogs.com/mengwang024/p/4204786.html

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