《算法导论》 - 第6章 - 堆排序 - 习题解答
来源:互联网 发布:用mac可以玩的游戏 编辑:程序博客网 时间:2024/06/05 21:15
序
GitHub 见solution.txt
6.1 堆
6.1-1
在高度为h的堆中,最多元素为
6.1-3
最大堆的特性是除了根结点外的每个结点都有
6.1-4
根据最大堆的性质,任何子树的子结点都小于根节点,故整棵树的最小元素必然位于堆的最底层或者倒数第二层的叶子结点。
6.1-5
不一定,是最小堆也可能是最大堆
6.1-6
不是,画出相应堆结构发现元素7是元素6的右孩子,
6.1-7
证明,当用数组表示存储了
除根节点,满足
PARENT(i) return i/2
除叶子结点,满足
LEFT(i) return 2*iRIGHT(i) return 2*i+1
堆中,最大根节点的下标为
将都是堆中的叶子结点。
6.2 保持堆的性质
6.2-2
C++代码如下:
void minHeapify(int *data, int i){ int minPos; int left = Left(i); int right = Right(i); if (left <= m_heapSize && data[left-1] < data[i-1]) minPos = left; else minPos = i; if (right <= m_heapSize && data[right-1] < data[minPos-1]) minPos = right; if (minPos != i) { swap(data[i - 1], data[minPos - 1]); minHeapify(data, minPos); }}
6.2-3
直接返回
6.2-4
此时i结点没有左右孩子,函数直接返回
6.2-5
迭代实现的manHeapify
void MaxHeap::maxHeapify(int *data, int i){ int largest; int left = Left(i); int right = Right(i); if (left <= m_heapSize && data[left-1] > data[i-1]) largest = left; else largest = i; if (right <= m_heapSize && data[right-1] > data[largest-1]) largest = right; while(largest != i) { swap(data[i - 1], data[largest - 1]); i = largest; left = Left(i); right = Right(i); if (left <= m_heapSize && data[left-1] > data[i-1]) largest = left; else largest = i; if (right <= m_heapSize && data[right-1] > data[largest-1]) largest = right; }}
6.2-6
对于一个大小为
6.3 建堆
6.3-2
[待补充]
6.3-3
参考
6.4 堆排序算法
6.4-2
堆排序算法HeapSort输入是一个大顶堆,输出是一个递增有序序列,由图6-4所示每次执行完该算法的2~5行迭代时,子数组
6.4-3
对于
对于
6.4-4
堆排序算法中,对A中每个元素最多处理一次:
(1)取下头结点,
(2)把最后一个结点移到根结点位置,
(3)对该结点执行MAX-HEAPIFY,最坏时间为
对每个结点处理的最坏时间是
因此堆排序的最坏情况运行时间为
6.5 优先级队列
未完待续 ^||^ ~~~
思考题
未完待续 ^||^ ~~~
- 《算法导论》 - 第6章 - 堆排序 - 习题解答
- 【算法导论 第6章 堆排序】
- 算法导论 第6章 堆排序
- 《算法导论》 第6章堆排序
- 算法导论第6章 堆排序
- 算法导论第6章堆排序
- 【算法导论 第6章 堆排序】
- 算法导论习题6-堆排序
- 算法导论 堆排序习题
- 算法导论 第7章部分习题解答
- 《算法导论》笔记 第6章 6.4堆排序算法
- 算法学习导论学习笔记-第6章 堆排序
- 算法导论代码 第6章 堆排序
- 《算法导论》第6章 堆排序 (2)优先级队列
- 算法导论第6章堆排序答案
- 算法导论学习笔记 第6章 堆排序
- 《算法导论》第6章 堆排序 个人笔记
- 《算法导论》第6章 堆排序 (1)最大堆与堆排序
- oracle 中BETWEEN命令
- Eclipse设置编译文件.class输出路径
- Compare Version Numbers
- 文章标题
- 黑马程序员——用函数实现两变量值交换
- 《算法导论》 - 第6章 - 堆排序 - 习题解答
- C# 中的委托和事件
- URL设计规范
- final修饰的变量是引用不能改变还是引用的对象不能改变
- linux程序设计——第一个线程程序(第十二章)
- Codeforces Round #311 (Div. 2)判环+Trie 好
- HBase数据存储格式
- leetcode 219:Contains Duplicate II
- iOS ImageView 默认是不和用户交互的 所以要开启交互功能