- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
15. 蛤蟆的数据构进阶十五排序实现之堆排序
15. 蛤蟆的数据结构进阶十五排序实现之堆排序
本篇名言:“谁要是游戏人生 , 他就一事无成 ; 谁不能主宰自己 , 永远是一个奴隶 。-- 歌德”
继续来看下堆排序。
堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种 HYPERLINK /view/9900.htm \t _blank 数据结构所设计的一种 HYPERLINK /view/297739.htm \t _blank 排序算法,它是选择排序的一种。可以利用 HYPERLINK /view/209670.htm \t _blank 数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] = A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
(a)大顶堆序列:(96, 83,27,38,11,09)
? (b)? 小顶堆序列:(12,36,24,85,47,30,53,91)
如图建堆初始过程:无序序列:(49,38,65,97,76,13,27,49)???????????????????????????????????????
代码实现
从一个无序序列建堆的过程就是一个反复筛选的过程。若将此序列看成是一个完全二叉树,则最后一个非终端节点是第[n/2]个元素,由此筛选只需从第[n/2]个元素开始。
代码核心是先将数组假想为完全二叉树。那么偶数位的数是左孩子,奇数位的数是右孩子。
先将数组进行完全二叉树处理,然后将根节点提取出来放到数组最后,将原先数组的最后一个元素放到根节点,因为不能保证原先数组最后一个的元素是剩下元素中最大的,所以要紧接着做一次处理(此次处理将最后一个元素除外)。接下去是继续去根节点放到数组倒数第二个位置,以此循环。
实现如下图1:
源码
#include stdio.h
void print(int a[], int n){
for(int j= 0; jn; j++){
printf(%d ,a[j]);
}
}
/**
* 已知H[s…m]除了H[s] 外均满足堆的定义
* 调整H[s],使其成为大顶堆 即将对第s个结点为根的子树筛选,
*
* @param H是待调整的堆数组
* @param s是待调整的数组元素的位置
* @param length是数组的长度
*
*/
void HeapAdjust(int H[],int s, int length)
{
int tmp = H[s];
int child = 2*s+1; //左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置)
while (child length) {
if(child+1 length H[child]H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)
++child ;
}
if(H[s]H[child]) { // 如果较大的子结点大于父结点
H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点
s = child; // 重新设置s ,即待调整的下一个结点的位置
child = 2*s+1;
} else { // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出
break;
}
H[s] = tmp; // 当前待调整的结点放到比其大的孩子结点位置上
}
// print(H,length);
}
/**
* 初始堆进行调整
* 将H[ length-1]建成堆
* 调整完之后第一个元素是序列的最小的元素
*/
void BuildingHeap(int H[], int length)
{
//最后一个有孩子的节点的位置 i= (length -1) / 2
for (int i = (length -1) / 2 ; i = 0; --i)
HeapAdjust(H,i,length);
}
/**
* 堆排序算法
*/
void HeapSort(int H[],int length)
{
//初始堆
BuildingHeap(H, length);
//从最后一个元素开始对序列进行调整
for (int i = length - 1; i 0; --
您可能关注的文档
- 1-项目建设工程安文明管理制度(2013版).docx
- 1.0-创新思维&新工具-曾子熙(2天).doc
- 1.01青白江区优无公害食用菌产业园建设.doc
- 1.1 西方媒介经学历史发展,沿革和代表人物.doc
- 1.1.1.4安全产法律法规、标准清单及符合性评价.doc
- 1.1 质点、参考和坐标系导学案 新人教版必修1.doc
- 1.1质点、参考系坐标系学案(人教版必修1).doc
- 1.2 使用连续无血压监测系统或间歇测量的动脉血压测量仪在剖腹产中发现低血压.doc
- 1.2.1排列(一学案(人教A版选修2-3).doc
- 1.2015届电子程学院毕业设计格式样文.doc
- 15.《小企业会计则》解读之会计科目及账务处理(新).doc
- 15.学籍学历管理作经验交流材料(洛阳师范学院).doc
- 1501期广州市专技术人员诚信与职业道德建设(视频答案).doc
- 150例原发性肝癌不同治疗手段的临床预后分析.doc
- 15.材料试验、设检测监理实施细则(房建).doc
- 1500吨聚丙烯排管生产车间工艺设计.doc
- 15、#1炉锅炉40V PC段检修文件包.doc
- 158系统精讲-内泌、营养、代谢-第二节 单纯性甲状腺肿病人的护理.doc
- 15、意外伤害保险度 Microsoft Word 文档.doc
- 15国网甘肃省电力司2013冬季安全考试试卷(变电类第15套).doc
原创力文档


文档评论(0)