算法导论第三版习题8.3
2016-03-02 17:17
274 查看
8.3-1
(1) 首先按最低位字母进行排序得到SEA,TEA,MOB,TAB,DOG,RUG,DIG,BIG,BAR,EAR,COW,ROW,NOW,BOX,FOX;(2) 然后对次低位字母进行稳定排序得到TAG,BAR,EAR,SER,TEA,DIG,BIG,MOB,DOG,COW,ROW,NOW,BOX,FOX,RUG;
(3) 最后对首位字母进行稳定排序得到BAR,BIG,BOX,COW,DIG,DOG,EAR,FOX,MOB,NOW,ROW,SEA,TAB,TEA。
8.3-2
插入排序,归并排序和快速都是稳定排序,只有堆排序不是稳定的。对于堆排序,可以修改MAX-HEAPIFY算法的第3到第7行如下:
3 if l <= A.heap-size and A[l] >= A[i] 4 largest = l 5 else largest = i 6 if r <= A.heap-size and A[r] >= A[largest] 7 largest = r
当节点ii的左右孩子节点中有一个与其相等时,将会造成多一次的交换,额外时间为Θ(n)\Theta(n),没有造成额外空间消耗。
8.3-3
我们可以归纳证明对于基数排序,当他进行完第ii列时,由第1列到第ii列的关键字构成的数的数组是已排好序的。(1) 首先,当i=1i=1时,我们本来就是对第1行进行排序,所以显然正确;
(2) 然后我们假设当i=k−1i=k-1时,由第1列到第k−1k-1列关键字构成的数的数组是已排好序的,那么当i=ki=k时,因为第ii列是最高位,所以最高位的大小决定了整个数的大小;当第ii列相等时,由低位决定大小,由底层排序算法稳定,所以保持了其大小顺序,所以原假设正确。
所以当最后i=di=d时,由第1列到第dd列,也即整个完整的数组已排好序。
8.3-4
将所有的整数作为以n为基的3位的数来调用基数排序,此时d=3d=3,k=nk=n,所以该方法的时间复杂度为Θ(3(n+n))=Θ(n)\Theta(3(n+n))=\Theta(n)。8.3-5
最坏的情况下,对于每一位上的排序都要分成dd位子问题,一共就需要进行∑d−1i=010i\sum_{i=0}^{d-1}10^i轮排序,一共需要记录∑di=110i\sum_{i=1}^d10^i堆卡片。相关文章推荐
- jdbc批量更新数据
- Java 泛型和通配符解惑
- Android中SharedPreferences的使用
- 老李教你性能测试监控工具nmon
- app名字后面的描述怎么加?
- 数据库建表原则
- elasticserch ik配置
- JMeter中对于Json数据的处理方法
- JDBC连接MySQL数据库
- LA 3644(p191)----X-Plosives
- SQL 合并数据
- 移动端 像素渲染流水线与GPU Hack
- javascript高级程序设计笔记-第七章(函数表达式)
- 简单的记事本功能实现代码--(流读取器)
- 文本框只允许输入数字.net/javascript
- 老李分享:loadrunne动态查询db2数据库
- 老李分享:loadrunner操作mysql数据库
- ViewData与ViewBag的使用
- 在android studio中使用greenDao
- UISearchBar改变输入框的背景颜色