二叉堆和堆排序Heapsort

二叉堆是一种数据结构

       

___________________________________________________________________________________________________________________________________

:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全二叉树,树中每个结点与数组中存放该结点值的那个元素对应。

二叉堆有两种:最大堆和最小堆(小根堆)。

堆的高度

堆可以被看成是一棵树,结点在堆中的高度可以被定义为从本结点到叶子结点的最长简单下降路径上边的数目;定义堆的高度为树根的高度。我们将看到,堆结构上的一些基本操作的运行时间至多是与树的高度成正比,为O(lgn)。

最大堆:所有节点的子节点比其自身小的堆。
最小堆:所有节点的子节点比其自身大的堆。

堆排序:堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单

在堆排序算法中,使用的是最大堆,最小堆通常在构造优先级队列时使用。

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 
 5 //堆化,保持堆的性质
 6 //Max_heapify 让a[i]在最大堆中“下降”,
 7 //使以i为根的子树成为最大堆。 
 8 void Max_heapify(int *a, int i, int size)
 9 {
10     int lt = i << 1, rt = (i << 1) + 1;//算法导论上推荐的方法是用位移 
11 //    int lt = 2*i, rt = 2*i+1;
12     int largest;
13     if(lt <= size && a[lt] > a[i])
14         largest = lt;
15     else 
16         largest = i;
17     if(rt <= size && a[rt] > a[largest])
18         largest = rt;
19     if(largest != i)                    //如果不符合堆的性质,则进行交换,且继续子节点 
20     {
21         int temp = a[i];
22         a[i] = a[largest];
23         a[largest] = temp;            
24         Max_heapify(a,largest,size);
25     }
26 }
27 
28 //自底而上地调用Maxheapify来将一个数组 变成一个最大堆。 
29 void BuildMaxheap(int *a, int size)        //建立堆 
30 {
31     for(int i = size/2; i>=1; --i)
32         Max_heapify(a,i,size);
33 }
34 
35 
36 //堆排序算法
37 //初始调用BuildMaxheap将a[i.....size]变成最大堆
38 //因为数组最大元素在a[1],则可以通过将a[i] 与 a[size]互换达到正确位置
39 //新的根元素破坏了最大堆的性质,所以调用Max_heapify调整
40 //使a[1......size-1]成为最大堆,a[1]又是最大的元素了,
41 //将a[1] 与 a[size-1] 调换位置
42 //反复调用Heapfiy,使整个数组从小到大排序
43 
44 // 注意: 交换只是破坏了以a[1]为根的二叉树最大堆性质,它的左右子二叉树还是具备最大堆性质。
45 //        这也是为何在BuildMaxHeap时需要遍历size/2到1的结点才能构成最大堆,而这里只需要堆化a[1]即可。 
46 void HeapSort(int *a, int size)
47 {
48     BuildMaxheap(a,size);
49     int len = size;
50     for( ; len >= 2 ; )
51     {
52         int temp = a[1];
53         a[1] = a[len];
54         a[len] = temp;
55         len--;
56         Max_heapify(a,1,len);
57     }
58 }
59 
60 
61 int main()
62 {
63     int i,a[11];
64     for(i=1;i<=10;i++)
65         scanf("%d",&a[i]);
66     HeapSort(a,10);
67     for(i=1;i<=10;i++)
68         printf("%d ",a[i]);
69     return 0;    
70 }

 

1 http://blog.csdn.net/made_in_chn/article/details/5473871

 

转载于:https://www.cnblogs.com/Lee-geeker/p/3247679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值