- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
堆排序及算法分析
前言
记得在学习数据结构的时候一味的想用代码实现算法,重视的是写出来的代码有一个正确的输入,然后有一个正确的输出,那么就很满足了。从网上看了许多的代码,看了之后貌似懂了,自己写完之后也正确了,但是不久之后就忘了,因为大脑在回忆的时候,只依稀记得代码中的部分,那么的模糊,根本不能再次写出正确的代码,也许在第一次写的时候是因为参考了别人的代码,看过之后大脑可以进行短暂的高清晰记忆,于是欺骗了我,以为自己写出来的,满足了成就感。可是代码是计算机识别的,而我们更喜欢文字,图像。所以我们在学习算法的时候要注重算法的原理以及算法的分析,用文字,图像表达出来,然后当需要用的时候再将文字转换为代码。记忆分为三个步骤:编码,存储和检索,就以学习为例,先理解知识,再归纳知识,最后巩固知识,为了以后的应用而方便检索知识。
堆排序过程
堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] = A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。调堆的过程应该从最后一个非叶子节点开始,假设有数组A = {1, 3, 4, 5, 7, 2, 6, 8, 0}。那么调堆的过程如下图,数组下标从0开始,A[3] = 5开始。分别与左孩子和右孩子比较大小,如果A[3]最大,则不用调整,否则和孩子中的值最大的一个交换位置,在图1中是A[7] A[3] A[8],所以A[3]与A[7]对换,从图1.1转到图1.2。
所以建堆的过程就是
1: for ( i = headLen/2; i = 0; i++)
2:?
3: do AdjustHeap(A, heapLen, i)
调堆:如果初始数组是非降序排序,那么就不需要调堆,直接就满足堆的定义,此为最好情况,运行时间为Θ(1);如果初始数组是如图1.5,只有A[0] = 1不满足堆的定义,经过与子节点的比较调整到图1.6,但是图1.6仍然不满足堆的定义,所以要递归调整,一直到满足堆的定义或者到堆底为止。如果递归调堆到堆底才结束,那么是最坏情况,运行时间为O(h) (h为需要调整的节点的高度,堆底高度为0,堆顶高度为floor(logn) )。
建堆完成之后,堆如图1.7是个大根堆。将A[0] = 8 与 A[heapLen-1]交换,然后heapLen减一,如图2.1,然后AdjustHeap(A, heapLen-1, 0),如图2.2。如此交换堆的第一个元
素和堆的最后一个元素,然后堆的大小heapLen减一,对堆的大小为heapLen的堆进行调堆,如此循环,直到heapLen == 1时停止,最后得出结果如图3。
1: /*
2: 输入:数组A,堆的长度hLen,以及需要调整的节点i
3: 功能:调堆
4: */
5:?
6: void AdjustHeap(int A[], int hLen, int i)
7: {
8: int left = LeftChild(i); //节点i的左孩子
9: int right = RightChild(i); //节点i的右孩子节点
10: int largest = i;
11: int temp;
12:?
13: while(left hLen || right hLen)
14: {
15: if (left hLen A[largest] A[left])
16: {
17: largest = left;
18: }
19:
20: if (right hLen A[largest] A[right])
21: {
22: largest = right;
23: }
24:?
25: if (i != largest) //如果最大值不是父节点
26: {
27: temp = A[largest]; //交换父节点和和拥有最大值的子节点交换
28: A[largest] =
您可能关注的文档
- 大学生的性别_性别角色及创业意向的关系_李海垒.pdf
- 2 第二章 matlab矩阵和其运算.ppt
- 2 集合及序列.ppt
- 大学生及畅销书.pdf
- 大学信息技术学习指导第2篇.doc
- 2.0进程与信号.pdf
- 大一数据库一到六篇课后题.doc
- 带并行总线USB接口器件.pdf
- 带根号函数最值问题.doc
- 2.1矩阵运算.ppt
- 高中物理课程在线学习平台建设与应用探索教学研究课题报告[001].docx
- 2024-2025学年学年高二地理《西亚北非》说课稿.docx
- 中东地区的宗教多元与文化交融教学研究课题报告.docx
- Unit 1 Science and Scientists Reading for Writing 选择性必修第二册.pptx
- Unit 1 Science and Scientists 表语从句 选择性必修第二册.pptx
- Unit 1 Science and Scientists Listening and Speaking 选择性必修第二册.pptx
- 2025年福建水利电力职业技术学院单招职业适应性考试题库新版.docx
- 毕业生实习报告书写.pptx
- 永城市委组织部党员电教中心上半年工作总结暨下半年工作计划.pptx
- 民政局主任竞聘上岗演讲稿.pptx
最近下载
- C++程序设计教程教学设计-初识C++教学设计.pdf VIP
- 邮政普遍服务标准.doc
- 2025年长沙商贸旅游职业技术学院单招职业技能测试题库精编答案.docx VIP
- 多关节机械手在晶圆减薄机中的应用 multi-articular robot application in back grinding machine.pdf VIP
- (正式版)SH-T 3145-2024 石油化工特殊用途汽轮机工程技术规范.pdf VIP
- 贵州省2025年初中物理学业水平考试(中考)模拟卷(一)(有答案).docx VIP
- 电力电子课程设计三相桥式SPWM逆变电路的设计及仿真.doc VIP
- 数字经济学教学课件.pptx VIP
- 小学科技制作活动教案 五下科技制作教案.doc
- 食品加工机械与设备.pptx VIP
文档评论(0)