1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分而治之

* * 稳定排序? 快速排序 * * * * 各排序算法平均时间的曲线图 * * 分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 1) 把它分成两个或多个更小的问题; 2) 分别解决每个小问题; 3) 把各小问题的解答组合起来,即可得到原问题的解答。 小问题通常与原问题相似,可以递归地使用分而治之策略来解决。 Chapter14 Divide and Conquer * * 一个用分治法编写的过程通常包括以下几部分:基值处理部分,(即把问题分到足够小后要进行的处理),分解问题的部分,递归调用部分和合并处理部分。 由于分治策略是把问题分成较小的与原问题类型相同的子问题,对子问题的处理过程与对原问题的处理过程是相同的。所以,分治法处理问题的算法可以自然地写成一个递归的过程。 * * 一个装有16个硬币的袋子。16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。任务是找出这个伪造的硬币。 为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。 找出伪币问题 * * 有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。 金块问题 * * 金块问题 * * 用函数M a x(程序1 - 3 1)通过n-1次比较找到最重的金块。找到最重的金块后,可以从余下的n-1个金块中用类似的方法通过n-2次比较找出最轻的金块。这样,比较的总次数为2n-3。 设c(n)为使用分而治之方法所需要的比较次数。为了简便,假设n是2的幂。当n=2时,c(n) = 1。对于较大的n,c(n) = 2c(n/2) + 2。当n是2的幂时,使用迭代方法可知c(n) = 3n/2 - 2。 在本例中,使用分而治之方法比逐个比较的方法少用了25%的比较次数。 金块问题 * * 可以运用分而治之方法来解决排序问题,问题是将n 个元素排成非递减顺序。 分而治之方法通常用以下的步骤来进行排序算法:若n 为1,算法终止;否则,将这一元素集合分割成两个或更多个子集合,对每一个子集合分别排序,然后将排好序的子集合归并为一个集合。 归并排序 * * 假设仅将n个元素的集合分成两个子集合。现在需要确定如何进行子集合的划分。 一种可能性就是把前面n-1个元素放到第一个子集中(称为A),最后一个元素放到第二个子集里(称为B)。按照这种方式对A递归地进行排序。由于B仅含一个元素,所以它已经排序完毕,在A排完序后,只需要将A和B合并起来。 归并排序-1 * * 把这种排序算法与InsertionSort(见程序2-15)进行比较,可以发现这种排序算法实际上就是插入排序的递归算法。 该算法的复杂性为O(n2)。 归并排序-1 * * 把n个元素划分成两个子集合的另一种方法是将含有最大值的元素放入B,剩下的放入A中。然后A被递归排序。为了合并排序后的A和B,只需要将B添加到A中即可。 归并排序-2 * * 假如用函数Max来找出最大元素,这种排序算法实际上就是SelectionSort的递归算法。 归并排序-2 * * 假如用冒泡过程来寻找最大元素并把它移到最右边的位置,这种排序算法就是BubbleSort的递归算法。这两种递归排序算法的复杂性均为Θ(n2)。 若一旦发现A已经被排好序就终止对A进行递归分割,则算法的复杂性为O(n2) 归并排序-3 * * 采用平衡分割法? A集合中含有n/k 个元素,B中包含其余的元素。 思考 * * templateclass T void sort( T E, int n) { / /对E中的n 个元素进行排序, k为全局变量 if (n = k) { i = n/k; j = n-i; 令A 包含E中的前i 个元素 令B 包含E中余下的j 个元素 sort( A , i ) ; sort( B , j ) ; merge(A,B,E,i,j,); //把A 和B 合并到E } else 使用插入排序算法对E 进行排序 } 分而治之排序算法的伪代码 * * k=2的排序方法被称为归并排序(merge sort),或更精确地说是二路归并排序(two-way merge sort)。 归并排序 * * 归并排序的平均复杂性为Θ(nlogn)。 归并排序 * * 另一种二路归并排序算法是这样的:首先将每两个相邻的大小为1的子序列归并,然后对上一次归并所得到的大小为2的子序列进行相邻归并,如此反复,直至最后归并到一个序列,归并过程完成。 通过轮流地将元素从a 归并到b 并从b 归并到a,可以虚拟地消除复制过程。 二路归

您可能关注的文档

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档