计算机算法设计与分析总复习
最新计算机算法设计与分析期末复习资料

一填空题(20x1=20分)1.当设定的问题有多种算法去解决时,其选择算法的主要原则是选择其中复杂性最低者。
2.用函数自身给出定义的函数是一种递归函数。
3.动态规划算法适用于解最优化问题。
4.贪心算法的两个基本要素是最优子结构性质、贪心选择性质。
5.回溯法在搜索解空间树的时候,为了避免无效搜索,通常使用深度优先手段来提高搜索效率。
6.依据求解目标的不同,分支界限法和回溯法分别用广度优先遍历或者最小耗费优先、深度优先的方式搜索解空间树。
7.分支界限法和回溯法主要区别在于求解目标和搜索方式不同。
8.在分支界限法实现的时候,通常采用方式来实现最大优先队列。
9.依据求解所花费的时间和所得到的结果不同,随机化算法大致分为数值随机化算法、蒙特卡罗算法、拉斯维加斯算法和舍伍德算法四类。
10.产生伪随机数最常用的方法是线性同余法。
11.线性规划算法中转轴变化的目的是将入基变量与离基变量互调位置。
12.最大网络流问题中可增广路是残留网络中一条容量大于0的路。
13.待解决问题适用于动态规划法的两个基本要素是。
14.算法必须满足的四个特征是输入、输出、确定性、有限性。
15.算法复杂性依赖于、、三个方面的复杂因素。
16.实现递归调用的关键是17.动态规划算法求解问题的重要线索是问题的性质。
18.最优子结构性质是贪心算法求解问题的关键特征。
19.分支界限法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
20.问题的解空间树常见的有子集树、排列树两种类型。
21.分支界限算法依据其从和节点表中选择获得下一扩展节点的不同方式被分为22.对于任何约束标准型线性规划问题,只要将所用分基本变量都设置为0,就可以获得一个解。
二判断题(20x1=20分)1.算法的描述方式有自然语言、程序语言,或者两者相结合的形式。
()2.算法满足的特性有哪些,程序有什么特征,而这有什么关系。
3.算法复杂度越高或者越低与占用计算机资源的关系是什么。
算法设计与分析复习题

算法设计与分析复习题算法设计与分析是计算机科学中的一个重要领域,它涉及到如何高效地解决计算问题。
以下是一些复习题,可以帮助学生更好地理解和掌握算法设计与分析的基本概念和技巧。
1. 算法的基本概念:- 什么是算法?请列举算法的基本特性。
- 解释算法的时间复杂度和空间复杂度,并给出一个例子。
2. 算法设计策略:- 描述贪心算法的工作原理,并给出一个实际问题的例子。
- 解释分治算法的基本步骤,并用快速排序算法来说明。
3. 排序算法:- 比较选择排序、插入排序和冒泡排序的时间复杂度。
- 描述归并排序和快速排序的工作原理,并讨论它们的优缺点。
4. 搜索算法:- 解释线性搜索和二分搜索的区别。
- 描述哈希表的工作原理,并讨论其在搜索算法中的应用。
5. 图算法:- 解释深度优先搜索(DFS)和广度优先搜索(BFS)的工作原理。
- 描述迪杰斯特拉(Dijkstra)算法和贝尔曼-福特(Bellman-Ford)算法,并比较它们的使用场景。
6. 动态规划:- 解释动态规划与分治法的区别。
- 给出一个动态规划解决的问题,并描述其解决方案。
7. 复杂度分析:- 什么是大O记号、大Ω记号和大Θ记号?它们如何帮助我们分析算法的效率?- 给出一个算法,并使用大O记号来分析其时间复杂度。
8. 算法优化:- 描述一些常见的算法优化技巧,例如空间换时间或时间换空间。
- 讨论算法优化在实际应用中的重要性。
9. 算法应用:- 举例说明算法在不同领域的应用,如在网络路由、机器学习或数据压缩中。
10. 算法的局限性:- 讨论算法在解决特定问题时可能遇到的局限性。
- 解释为什么某些问题被认为是不可解的或计算上不可行的。
结束语:通过这些复习题的练习,学生应该能够加深对算法设计与分析的理解,掌握不同算法的原理和应用场景,以及如何评估和优化算法的性能。
希望这些题目能够帮助学生在考试或实际工作中更加自信和高效。
!算法设计与分析总复习

!算法设计与分析总复习算法设计与分析是计算机科学中非常重要的一个领域,它涉及到了算法的设计、性能分析和优化等方面。
在准备考试之前,我们需要对算法设计与分析的基本概念和常用算法进行全面复习。
一、算法设计与分析基本概念1.算法的定义:算法是一系列解决特定问题的有限步骤。
2.算法的特性:算法具有明确性、有限性、确定性和输入/输出。
3.算法的正确性:算法必须能够解决问题,并得到正确的答案。
4.算法的效率:算法的时间复杂度和空间复杂度是衡量算法效率的重要指标。
二、常用算法1.排序算法:常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。
需要了解每种排序算法的思想、时间复杂度和空间复杂度,并能够对其进行实现和优化。
2.查找算法:常用的查找算法包括顺序查找、二分查找、哈希查找等。
需要了解每种查找算法的思想和时间复杂度,并能够对其进行实现和应用。
3. 图算法:图算法包括深度优先(DFS)、广度优先(BFS)、最短路径算法(Dijkstra算法、Floyd算法)等。
需要了解这些算法的思想、时间复杂度和应用场景,并能够对其进行实现和应用。
4.动态规划算法:动态规划算法适用于具有重叠子问题和具有最优子结构性质的问题。
需要了解动态规划算法的基本思想、时间复杂度和应用场景,并能够对具体问题进行动态规划的设计和实现。
5.贪心算法:贪心算法常用于解决最优化问题,每一步都选择当前最优解,以期最终达到全局最优解。
需要了解贪心算法的基本思想、时间复杂度和应用场景,并能够对具体问题进行贪心算法的设计和实现。
三、算法的时间复杂度和空间复杂度1. 时间复杂度:算法的时间复杂度表示算法的执行时间和输入数据规模之间的关系。
常见的时间复杂度有O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)等。
需要掌握各种时间复杂度的计算方法和复杂度的比较。
2.空间复杂度:算法的空间复杂度表示算法的内存消耗和输入数据规模之间的关系。
计算机算法设计与分析复习题与答案1

《算法分析与设计》期末复习题(一)一、选择题1.应用Johnson 法则的流水作业调度采用的算法是(D )A. 贪心算法B. 分支限界法C.分治法D. 动态规划算法2.Hanoi 塔问题如下图所示。
现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置。
移动圆盘时遵守Hanoi 塔问题的移动规则。
由此设计出解Hanoi 塔问题的递归算法正确的为:(B )Hanoi 塔3. 动态规划算法的基本要素为(C)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用4. 算法分析中,记号O表示(B),记号Ω表示(A),记号Θ表示(D)。
A.渐进下界B.渐进上界C.非紧上界D.紧渐进界E.非紧下界5. 以下关于渐进记号的性质是正确的有:(A)A.f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB. f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D. f(n)O(g(n))g(n)O(f(n))=⇔=6.能采用贪心算法求最优解的问题,一般具有的重要性质为:(A)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用7. 回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。
A.广度优先B. 活结点优先 C.扩展结点优先 D. 深度优先8. 分支限界法在问题的解空间树中,按(A)策略,从根结点出发搜索解空间树。
A.广度优先B. 活结点优先 C.扩展结点优先 D. 深度优先9. 程序块(A)是回溯法中遍历排列树的算法框架程序。
A.B.C.D.10. 回溯法的效率不依赖于以下哪一个因素?(C )A.产生x[k]的时间;B.满足显约束的x[k]值的个数;C.问题的解空间的形式;D.计算上界函数bound的时间;E.满足约束函数和上界函数约束的所有x[k]的个数。
算法设计与分析复习要点

算法设计与分析的复习要点第一章:算法问题求解基础算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
一.算法的五个特征:1.输入:算法有零个或多个输入量;2.输出:算法至少产生一个输出量;3.确定性:算法的每一条指令都有确切的定义,没有二义性;4.可行性:算法的每一条指令必须足够基本,它们可以通过已经实现的基本运算执行有限次来实现;5.有穷性:算法必须总能在执行有限步之后终止。
二.什么是算法?程序与算法的区别1.笼统地说,算法是求解一类问题的任意一种特殊的方法;较严格地说,算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
2.程序是算法用某种程序设计语言的具体实现;算法必须可终止,程序却没有这一限制;即:程序可以不满足算法的第5个性质“有穷性”。
三.一个问题求解过程包括:理解问题、设计方案、实现方案、回顾复查。
四.系统生命周期或软件生命周期分为:开发期:分析、设计、编码、测试;运行期:维护。
五.算法描述方法:自然语言、流程图、伪代码、程序设计语言等。
六.算法分析:是指对算法的执行时间和所需空间的估算。
算法的效率通过算法分析来确定。
七.递归定义:是一种直接或间接引用自身的定义方法。
一个合法的递归定义包括两部分:基础情况和递归部分;基础情况:以直接形式明确列举新事物的若干简单对象;递归部分:有简单或较简单对象定义新对象的条件和方法八.常见的程序正确性证明方法:1.归纳法:由基础情况和归纳步骤组成。
归纳法是证明递归算法正确性和进行算法分析的强有力工具;2.反证法。
第二章:算法分析基础一.会计算程序步的执行次数(如书中例题程序2-1,2-2,2-3的总程序步数的计算)。
二.会证明5个渐近记法。
(如书中P22-25例2-1至例2-9)三.会计算递推式的显式。
(迭代法、代换法,主方法)四.会用主定理求T(n)=aT(n/b)+f(n)。
(主定理见P29,如例2-15至例2-18)五.一个好的算法应具备的4个重要特征:1.正确性:算法的执行结果应当满足预先规定的功能和性能要求;2.简明性:算法应思路清晰、层次分明、容易理解、利于编码和调试;3.效率:算法应有效使用存储空间,并具有高的时间效率;4.最优性:算法的执行时间已达到求解该类问题所需时间的下界。
计算机算法设计与分析 复习资料

第一章(1)最坏情况下的时间复杂性Tmax(n) = max{ T(I) | size(I)=n }(2)最好情况下的时间复杂性Tmin(n) = min{ T(I) | size(I)=n }(3)平均情况下的时间复杂性Tavg(n) =其中I 是问题的规模为n 的实例,p (I)是实 例I 出现的概率。
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明:对于任意f1(n) ∈ O(f(n)) ,存在正常数c1和自然数n1,使得对所有n ≥ n1,有f1(n) ≤ c1f(n) 。
类似地,对于任意g1(n) ∈ O(g(n)) ,存在正常数c2和自然数n2,使得对所有n ≥ n2,有g1(n) ≤ c2g(n) 。
令c3=max{c1, c2}, n3 =max{n1, n2},h(n)= max{f(n),g(n)} 。
则对所有的 n ≥ n3,有f1(n) +g1(n) ≤ c1f(n) + c2g(n)≤ c3f(n) + c3g(n)= c3(f(n) + g(n))≤ c32 max{f(n),g(n)}= 2c3h(n) = O(max{f(n),g(n)}) .算法分析的基本法则非递归算法:(1)for / while 循环循环体内计算时间*循环次数;(2)嵌套循环循环体内计算时间*所有循环次数;(3)顺序语句各语句计算时间相加;(4)if-else 语句if 语句计算时间和else 语句计算时间的较大者。
第二章 递归与分治策略递归算法总体思想:将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
∑=n I size I T I p )()()(边界条件与递归方程是递归函数的二个要素优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
算法设计与分析 复习整理汇编

《算法设计与分析》复习要点2.算法的概念:答:算法是求解一类问题的任意一种特殊的方法。
一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。
注:算法三要素:1、操作2、控制结构3、数据结构3.算法有5大特性:答:输入、输出、确定性、能行性、有穷性。
注:输入:一个算法有0个或多个输入;输出:一个算法将产生一个或多个输出。
确定性:一个算法中每一步运算的含义必须是确切的、无二义性的;可行性:一个算法中要执行的运算都是相当基本的操作,能在有限的时间内完成;有穷性:一个算法必须在执行了有穷步运算之后终止;4.算法按计算时间可分为两类:答:多项式时间算法的渐进时间复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3),具有此特征的问题称为P为题。
有效算法。
指数时间算法的渐进时间复杂度之间的关系为:O(2^n)<O(n!)< O(n^n),具有此特征的问题称为NP问题。
注:可以带1或2这些数字来判断它们之间的大小关系。
5.一个好算法的4大特性:答:正确性、简明性、效率、最优性。
注:正确性:算法的执行结果应当满足预先规定的功能和性能要求。
简明性:算法应思路清晰、层次分明、容易理解。
利于编码和调试。
效率:时间代价和空间代价应该尽可能的小。
最优性:算法的执行时间已经到求解该类问题所需要时间的下界。
6.影响程序运行时间的因素:1、答:程序所以来的算法。
问题规模和输入数据。
计算机系统系能。
注:算法运行的时间代价的度量不应依赖于算法运行的软件平台,算法运行的软件包括操作系统和采用的编程语言及其编译系统。
时间代价用执行基本操作(即关键操作)的次数来度量,这是进行算法分析的基础。
7.关键操作的概念答:指算法运行中起主要作用且花费最多时间的操作。
1.简述分治法是怎样的一种算法设计策略:答:将一个问题分解为若干个规模较小的子问题,且这些子问题互相独立且与原问题类型相同,递归地处理这些子问题,直到这些子问题的规模小到可以直接求解,然后将各个子问题的解合并得到原问题的解。
算法设计与分析复习题整理(1)

算法设计与分析复习题整理(1)一、基本题:算法:1、程序是算法用某种程序设计语言的具体实现。
2、算法就是一组有穷的序列(规则) ,它们规定了解决某一特定类型问题的一系列运算。
3、算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。
4、算法的“确定性”指的是组成算法的每条指令是清晰的,无歧义的。
5、算法满足的性质:输入、输出、确定性、有限性。
6、衡量一个算法好坏的标准是时间复杂度低。
7、算法运行所需要的计算机资源的量,称为算法复杂性,主要包括时间复杂性和空间复杂性。
8、任何可用计算机求解的问题所需的时间都与其规模有关。
递归与分治:9、递归与分治算法应满足条件:最优子结构性质与子问题独立。
10、分治法的基本思想是首先将待求解问题分解成若干子问题。
11、边界条件与递归方程是递归函数的两个要素。
12、从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法。
13、将一个难以直接解决的大问题,分解成一些规模较小的相同问题,以便各个击破。
这属于分治法的解决方法。
14、Strassen矩阵乘法是利用分治策略实现的算法。
15、大整数乘积算法是用分治法来设计的。
16、二分搜索算法是利用分治策略实现的算法。
动态规划:17、动态规划算法的两个基本要素是最优子结构性质和重叠子问题性质。
18、下列算法中通常以自底向上的方式求解最优解的是动态规划法。
19、备忘录方法是动态规划算法的变形。
20、最优子结构性质是贪心算法与动态规划算法的共同点。
21、解决0/1背包问题可以使用动态规划、回溯法,其中不需要排序的是动态规划,需要排序的是回溯法。
贪心算法:22、贪心算法总是做出在当前看来最好的选择。
也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优解。
23、最优子结构性质是贪心算法与动态规划算法的共同点。
24、背包问题的贪心算法所需的计算时间为 O(nlogn) 。
回溯法:25、回溯法中的解空间树结构通常有两种,分别是子集树和排列树。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在最坏情况下,算法randomizedSelect需要O(n2)计算时间 但可以证明,算法randomizedSelect可以在O(n)平均时间内 找出n个输入元素中的第k小元素。
线性时间选择
将n个输入元素划分成n/5个组,每组5个元素,只可能 有一个组不是5个元素。用任意一种排序算法,将每组中的 元素排好序,并取出每组的中位数,共n/5个。 递归调用select来找出这n/5个元素的中位数。如果 n/5是偶数,就找它的2个中位数中较大的一个。以这个 元素作为划分基准。
基于分治法的递归
2.1 递归的概念
例 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,„„,称为 Fibonacci数列。它可以递归地定义为: 边界条件 1 n0 F ( n) 1 n 1 F (n 1) F (n 2) n 1 递归方程 第n个Fibonacci数可递归地计算如下: int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }
线性时间选择问题
问题描述:给定线性集中n个元素和一个整数
k,要求找出这n个元素中第k小的元素,即如果 将这n个元素依其线性序排列时,排在第k个位 置的元素即为我们要找的元素。 当k=1时,即找最小元素;当k=n时,即找最大 元素;当k=(n+1)/2时,称为找中位数。
线性时间选择
template<class Type> Type RandomizedSelect(Type a[],int p,int r,int k) { if (p==r) return a[p]; int i=RandomizedPartition(a,p,r), j=i-p+1; if (k<=j) return RandomizedSelect(a,p,i,k); else return RandomizedSelect(a,i+1,r,k-j); }
合并排序
基本思想:将待排序元素分成大小大致相同的2个子集合,分 别对2个子集合进行排序,最终将排好序的子集合合并成为所 要求的排好序的集合。 复杂度分析 O(1) n 1 public static void T (n) 2T (n / 2) O(n) n a[], int left, int right) mergeSort(Comparable 1 { T(n)=O(nlogn) 渐进意义下的最优算法 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 } }
分治算法总体思想
分治法的设计思想是,将一个难以直接解决的 大问题,分割成一些规模较小的相同问题,以 便各个击破,分而治之。
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
该问题的规模缩小到一定的程度就可以容易地解 决; 该问题可以分解为若干个规模较小的相同问题, 即该问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问 题的解;
则记作f(n) = Ο (g(n))
含义: 如果算法用n值不变的同一类数据在某台机器上运行时,所 用的时间总是小于|g(n)|的一个常数倍。所以g(n)是计算 时间f(n)的一个上界函数。 f(n)的数量级就是g(n)。 f(n)的增长最多像g(n)的增长那样快 试图求出最小的g(n),使得f(n) = Ο (g(n))。
3)“平均情况”限界函数
定义1.3 如果存在正常数c1,c2和n0,对于所有的
n≥n0,有
c1|g(n)| ≤|f(n)| ≤ c2|g(n)|
则记作
f (n) ( g (n))
含义: 算法在最好和最坏情况下的计算时间就一个常数因子范 围内而言是相同的。可看作: 既有f(n) = Ω (g(n)),又有f(n) = Ο (g(n)) 记号表明算法的运行时间有一个较准确的界
算法渐近复杂性
定义 1.2 设算法的执行时间 T ( n ) ,如果存在 T * ( n ) , 使得
T (n ) T *( n ) lim 0 n T (n )
就称 T * ( n ) 为算法的渐近时间复杂性。
1)上界函数
有 |f(n)| ≤ c|g(n)|
定义1 如果存在两个正常数c和n0,对于所有的n≥n0
该问题所分解出的各个子问题是相互独立的,即 子问题之间不包含公共的子问题。
分治法的基本步骤
(1)分解:将原问题分解为若干个规模较小
,相互独立,与原问题形式相同的子问题;
(2)解决:若子问题规模较小而容易被解决 则直接解,否则递归地解各个子问题; (3)合并:将各个子问题的解合并为原问题 的解。
线性时间选择问题算法
上述Partition算法可用来求选择问题的有效解。 如果划分元素v测定在A(j)的位置上,则有j1个元素小于或等于A(j),且有n-j 个元素大于或 等于A(j)。因此,若k<j,则第k小元素在A(1: j-1)中,再对之进一步划分。 若k=j,则A(j)就是第k小元素 若k>j,则第k小元素在A(j+1:n)中,再对之进一 步划分。
说明:当n取值较大时,指数时间算法和多项式
时间算法在计算时间上非常悬殊。
典型的计算时间函数曲线
2)下界函数
定义1.2 如果存在两个正常数c和n0,对于所有的 n≥n0,有
|f(n)| ≥ c|g(n)|
则记作f(n) = Ω (g(n)) 含义:
如果算法用n值不变的同一类数据在某台机器上运行时 所用的时间总是不小于|g(n)|的一个常数倍。所以g(n 是计算时间f(n)的一个下界函数。 f(n)的增长至少像g(n)的增长那样快 试图求出“最大”的g(n),使得f(n) = Ω (g(n))。
O(1) n 1 T (n) kT (n / k ) f (n) n 1
通过迭代法求得方程的解: T (n) n bnlog kn
二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找 出一特定元素x。
据此容易设计出二分搜索算法:
算法复杂度分析: template<class Type> 每执行一次算法的while int BinarySearch(Type a[], const Type& x, int l, int r) 循环, 待搜索数组的大 { 小减少一半。因此,在最 while (r >= l){ 坏情况下,while循环被 int m = (l+r)/2; if (x == a[m]) return m; 执行了O(logn) 次。循环O(1) 时间, else l = m+1; 因此整个算法在最坏情况 } 下的计算时间复杂性为 return -1; O(logn) 。 }
分治法的复杂性分析
一个分治法将规模为n的问题分成k个规模为n/k的子问题 去解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个 单位时间。再设将原问题分解为k个子问题以及用merge将k 个子问题的解合并为原问题的解需用f(n)个单位时间。用 T(n)表示该分治法解规模为|P|=n的问题所需的计算时间, 则有:
任何一种程序设计语言都可以实现任何 一个算法
算法的有穷性意味着不是所有的计算机 程序都是算法
问题求解(Problem Solving)
理解问题 精确解或近似解 选择数据结构 算法设计策略 设计算法 证明正确性 分析算法 设计程序
算法复杂性
= 算法所需要的计算机资源
=时间复杂性+空间复杂性
一般只考虑三种情况下的时间性:最坏情况、 最好情况和平均情况下的复杂性,分别记为 Tmax(n)、 Tmin(n)和Tavg(n)
合并排序
算法mergeSort的递归过程可以消去。
初始序列
[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]
快速排序
private static void qSort(int p, int r) { if (p<r) { int q=partition(p,r); //以a[p]为基准元素将a[p:r]划分成 3段a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何元素小于等 于a[q],a[q+1:r]中任何元素大于等于a[q]。下标q在划分过 程中确定。 qSort (p,q-1); //对左半段排序 qSort (q+1,r); //对右半段排序 } }
最优算法
问题的计算时间下界为(f(n)),则计算 时间复杂性为O(f(n))的算法是最优算法。
例如,排序问题的计算时间下界为 (nlogn),计算时间复杂性为O(nlogn)的
排序算法是最优算法。
第2章 递归与分治策 略
2.1 递归的概念
函数自身给出定义的函数称为递归函数。
直接或间接地调用自身的算法称为递归算法。 基于归纳法的递归
算法 消去递归的合并排序算法
输入:具有个元素的数组A[]