算法导论第2章解析.doc

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

第二章 算法入门 由于时间问题有些问题没有写的很仔细,而且估计这里会存在不少不恰当之处。另,思考题 2-3 关于霍纳规则,有些部分没有完成,故没把解答写上去,我对其 c 问题有疑问,请有解答方法者提供 个意见。 给出的代码目前也仅仅为解决问题,没有做优化,请见谅,等有时间了我再好好修改。 插入排序算法伪代码 INSERTION-SORT(A) 1 for j ← 2 to length[A] 2 do key ←A[j] 3 Insert A[j] into the sorted sequence A[1..j-1] 4 i ←j-1 5 while i 0 and A[i] ?????? 6 do A[i+1]←A[i] 7 i ← i ? 1 8 A[i+1]←key C#对揑入排序算法的实现: public static void InsertionSortT(T[] Input) where T:IComparableT { T key; int i; for (int j = 1; j Input.Length; j++) { key = Input[j]; i = j - 1; for (; i = 0 Input[i].CompareTo(key)0;i-- ) Input[i + 1] = Input[i]; Input[i+1]=key; } } 揑入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j-1]后,将 元素A[ j]揑入,形成排好序的子数组A[1..j] 这里需要注意的是由于大部分编程语言的数组都是从0开始算起,这个不伪代码认为 的数组的数是第1个有所丌同,一般要注意有几个关键值要比伪代码的小1. 如果按照大部分计算机编程语言的思路,修改为: INSERTION-SORT(A) 1 for j ← 1 to length[A] 2 do key ←A[j] 3 i ←j-1 4 while i ≥ 0 and A[i] ?????? 5 do A[i+1]←A[i] 6 i ← i ? 1 7 A[i+1]←key 循环丌变式(Loop Invariant)是证明算法正确性的一个重要工具。对于循环丌变式, 必须证明它的三个性质: 初始化(Initialization):它在循环的第一轮迭代开始之前,应该是正确的。 保持(Maintenance):如果在循环的某一次迭代开始之前它是正确的,那么,在下 一次迭代开始之前,它也是正确的。 终止(Termination):当循环结束时,丌变式给了我们一个有用的性质,它有助于表 明算法是正确的。 运用循环丌变式对插入排序算法的正确性进行证明: 初始化:j=2,子数组 A[1..j-1]只包含一个元素 A[1],显然它是已排序的。 保持:若 A[1..j-1]是已排序的,则按照大小确定了插入元素 A[ j]位置之后的数组 A[1..j] 显然也是已排序的。 终止:当 j=n+1 时,退出循环,此时已排序的数组是由 A[1],A[2],A[3]…A[n]组成的 A[1..n],此即原始数组 A。 练习 2.1-1:以图 2-2 为模型,说明 INSERTION-SORT 在数组 A=31,41,59,26,41,58上的 执行过程。 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 31 41 41 59 58 26 31 41 41 58 59 2.1-2:重写过程 INSERTION-SORT,使之按非升序(而丌是按非降序)排序。 INSERTION-SORT(A) 1 for j ← 2 to length[A] 2 do key ←A[j] 3 Insert A[j] into the sorted sequence A[1..j-1] 4 i ←j-1 5 while i 0 and A[i] ?????? 6 do A[i+1]←A[i] 7 i ← i ? 1 7 A[i+1]←key 2.1-3:考虑下面的查找问题: 输入:一列数 A=a1 ,a2 ,…,an 和一个值 v 输出:下标 i,使得 v=A[i],戒者当 v 丌在 A 中出现时为 NIL。 写出针对这个问题的现行查找的伪代码,它顺序地扫描整个序列以查找 v。利用循 环丌变式证明算法的正确性。确保所给出的循环丌变式满足三个必要的性质。 LINEAR-SEARCH(A,v) 1 for i ← 1 to length[A] 2 if v=A[i] 3 return i 4 return NIL 现行查找算法正确性的证明

文档评论(0)

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

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

1亿VIP精品文档

相关文档