- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
QUICKSORT( A, p, r ) 1 if p r 2 then q = PARTITION( A, p, r ) 3 QUICKSORT( A, p, q-1 ) 4 QUICKSORT( A, q+1, r ) 分治法 快速排序 PARTITION( A, p, r ) 1 x = A[r] 2 i = p-1 3 for j = p to r-1 4 do if A[j] = x 5 then i = i+1 6 exchange( A[i], A[j] ) 7 exchange( A[i+1], A[r] ) 8 return i+1 分治法 快速排序 Partition 过程例子 Quicksort 算法复杂度 T(n) = T(q) + T(n-q-1) + O( n ) Expected running time: Θ(n log n) 扩展 求第k大数 K_BIGGEST( A, p, r, k ) 1 if p r 2 then q = PARTITION( A, p, r ) 3 if ( k q ) K_BIGGEST( A, p, q-1, k ) 4 else K_BIGGEST( A, q+1, r, k ) 5 return k Merge Sort 基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 void MergeSort( int a[ ], int left, int right) { if ( left right ) {//至少有2个元素 int i = ( left + right ) / 2; //取中点 MergeSort(a, left, i); MergeSort(a, i+1, right); Merge(a, b, left, i, right); //合并到数组b copy(a, b, left, right); //复制回数组a } } 复杂度分析 T(n)=O(nlogn) 渐进意义下的最优算法 Merge Sort 初始序列 [49] [38] [65] [97] [76] [13] [27] [38 49] [65 97] [13 76] [27] 第一步 第二步 [38 49 65 97] [13 27 76] 第三步 [13 27 38 49 65 76 97] Toj-1455 Ultra-Quicksort 题目叙述: Ultra-QuickSort算法是通过不断地交换相领两个数的值,最终将n个不同的数变成升序的.例如序列(9,1,0,5,4)的最终结果是(0,1,4,5,9). 给出一个序列,你的任务就是计算如果把这个序列排成升序的,Ultra-QuickSort必须需要多少次交换. Ultra-Quicksort 要解决这个问题,我们首先要知道必须需要的交换次数,也就是最少的交换次数是什么? 可以证明完成这样一个排序的最少交换次数即为需要排序的序列的逆序数,稍后我们会给出证明.现在让我们首先考虑如何用归并排序求得一个序列的逆序数. Ultra-Quicksort 证明: 若a[i]a[j]且ij,则称a[i],a[j]为逆序数对。 求出逆序数对的总数便是问题的解。因为每次相 邻的两个数交换都会使逆序数对个数加一或减一, 并且每次操作一定可以使逆序数对减一,所以最 少的交换次数就是逆序数对的个数。 练习 Toj-1133 约瑟夫问题 Toj-1656 约瑟夫问题 Toj-3075 约瑟夫问题 Toj-1455 合并排序 Toj-3270 汉诺塔问题 Toj-2242 逆序数 Pku-3070 快速幂取模 参考书目 具体数学 算法导论 算法艺术与信息学竞赛 Thank you 递归和分治 主讲: 陈澜搏 07级软件3班 Email: chenplato@126.com 2009-12-5 递归 递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像. 优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 递归 n! int f( int n
文档评论(0)