第四章 算法基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该公式递归地定义了Fibonacci数列。
4.3.7 查找
1.顺序查找
【案例4.9】在给定
的10个数{23,45, 62,12,33,87,90, 55,13,79}组成的 列表中查找数12。
4.3.8 排序
1.冒泡排序 将待排序的数据依次进行相邻两个数据的比较,如不符合顺序 要求(由大到小或由小到大)就立即交换。这样值大(或小) 的就会像冒气泡一样逐步升起。按此方法对数据经过一轮比较 移位后称为一趟冒泡,第1趟冒泡的效果是将数据值最大(或 最小)的元素交换到了最后的位置,即该数据排序的最终位置。 n个数据最多需要进行n1趟冒泡。
4.3.8 排序
2.选择排序 【案例4.12】用选择排序法将N 从待排序的n个数据的列表(R1, (N=7)个无序数据(9, 5, 7, 2, R2, R3,..., Rn)中选出最小的数 4, 8, 3)其按升序排列。 (按升序)或最大的数(按降 序),将它与R1交换;然后再 从余下的n-1个数中选出次小 (或次小)的元素与R2进行交 换;第i趟排序时(R1, R2,..., Ri-1) 已排好序,在当前无序的(Ri,..., Rn)中再选出最小(或最大) 的元素,将它与Ri元素交换,使 (R1, R2,..., Ri)成为有序。依此 类推,经过n-1趟排序后,全部 数据就递增(或递减)有序了。
18
logn
• 算法的复杂度常用数量级表示。 0 1 0 1 2 • 若设问题规模为n,则常见的复杂度有:
1 – O(1) 2 —— 常数阶 2 4 4 2 – O(n) 4 —— 线性阶 8 16 16
n
nlogn
n2
2n
– O(log n) —— 对数阶 3 8 24 64 – O(nlog n) —— 线性对数阶 4 – O(n216 64 256 ) —— 平方阶 n)—— 指数阶 – O ( 2 5 32 160 1024
“兔子繁殖问题”:假定一对小兔子一个月就可以长成大兔
子(一雄一雌),而一对大兔子每个月都会生出一对小兔子。 如果年初养了一对小兔子,到年底时将有多少对兔子? (假
设兔子没有死亡而且严格按照上述Fra Baidu bibliotek律长大与繁殖)
兔子繁殖的结果
月 1月 兔 小 兔 大 兔 合 计 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
用程序设计语言(Programming Language)表示算法就是用
计算机高级语言编写程序,程序是可以在计算机上经过编译、 连接、运行出结果的算法表示。
int max( int a, int b, int c) { int max; if(a > b)
max = a; else max = b; if(c > max) max = c; return max; } }
4.3.8 排序
3.插入排序 把n个待排序的数据分为两 部分:{R1,...,Ri1}为已排 好序的有序表,{Ri, Ri+1,...,Rn}为未排序的无 序表(初始时,令i=2)。 然后,把未排序部分的第1 个数据Ri依次与R1,...,Ri-1 比较,并插入到有序表的 适当位置上,使得{R1,..., Ri}变为一个新的有序表, 直到未排序表中的数据元 素全部插入到有序表中。 【案例4.13】用插入排序法将N (N=5)个无序数据(30, 16, 25, 17, 12)其按升序排列。 初始数据 第1步 第2步 第3步 第4步 [30] [16 [16 [16 [12 16 30] 25 17 16 25 25 30] 25 17 17 17 17 30] 25 12 12 12 12 30]
1
1 1 1
1
1 2
1
2 3
2
3 5
3
5 8
5
8 13
8
13 21
13
21 34
21
34 55
34
55 89
55
89 144
4.3.5 递归(续)
假设第N个月的兔子数目是F(N),可以得到如下公式:
1 N 2 F( N ) F( N 1 ) F( N 2 ) N 2
int main(void) { int a, b, c,Imax; scanf("%d%d%d",&a,&b,&c); Imax=max(a, b, c); printf("max=%d", Imax);
4.3.1 求和
【案例4.2】计算1~100的和。 思考1:如何计算m~n之间的偶 数或奇数之和。
到第10天早上想再吃时,见只剩下一个桃
子了。求猴子第一天共摘了多少个桃子?
4.3.4 迭代
【案例4.6】给定一个数n,判 断n是不是素数。
素数是指只能被1和它自己整 除的数。
可以证明,只需依次用2~
或2~ 之间的各数去除n就 可说明n是不是素数。
4.3.5 递归
递归是把一个复杂的问题逐层分解为最 简单问题,再由最简单问题逐层回代, 直到求出问题的解。
两个方程: a+b+c=100 5a+3b+c/3=100
(1) (2)
采用穷举法,依次对a,b,c取值范围内的各数一一试探,找出
满足方程(1)和(2)的组合。
流程图参见教材4.9。
4.3.4 迭代
迭代法又称递推法,它是从已知的初始 条件出发,逐次推出所要求的各中间结 果和最后结果。
【案例4.5】猴子吃桃问题。一只猴子第 一天摘下若干桃子,当即吃了一半,还不 过瘾,又多吃了一个,第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后 每天早上都吃了前一天剩下的一半零一个。
思考2:如何计算下式:
s 1
1 1 1 ... 12 123 1 2 3 ... n
开始 0=>sum 1=>k N k≤100 Y sum + k =>sum k+1 => k
结束
4.3.2 累乘
【案例4.3】计算10! 。 思考1:如何计算x 的流程图。
第四章 算法基础
• 利用计算机求解问题的一般过程:
需求分析 实际 问题
分析 抽象
系统设计
模型 建立
模型 分析
结构 设计
结构 分析
算法设计/分 析/模拟
编程 调试
编码 实现
结 果
测试 程序
2
4.3.2 流程图
常用传统流程图符号 求任意3个 正整数a、b、 c中的最大 者的流程图
4.2.4 程序设计语言
256
65535 4294967296
19
【案例4.6】年龄问题。有5个人坐在一起,问第5个人 多少岁?他说比第4个人大2岁。问第4个人的岁数,他
说比第3个人大2岁。问第3个人的岁数,他说比第2个人
大2岁。问第2个人,他说比第1个人大2岁。最后问第1 个人,他说是10岁。请问第5个人多大?
4.3.5 递归(续)
4.3.5 递归(续)
【案例4.7】Fibonacci数列。
思考2:如何计算下式:
sin( x ) x
n
x3
3!
x5
5!
x7
7!
x9
9!
4.3.3 穷举
【案例4.4】百钱买百鸡。我国古代的《张丘建算经》中有
一个著名的百鸡问题:鸡翁一,值钱五;鸡母一,值钱三; 鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 假设鸡翁、鸡母、鸡雏分别为a,b,c只,由题意可得如下
4.3.7 查找
1.顺序查找
【案例4.9】在给定
的10个数{23,45, 62,12,33,87,90, 55,13,79}组成的 列表中查找数12。
4.3.8 排序
1.冒泡排序 将待排序的数据依次进行相邻两个数据的比较,如不符合顺序 要求(由大到小或由小到大)就立即交换。这样值大(或小) 的就会像冒气泡一样逐步升起。按此方法对数据经过一轮比较 移位后称为一趟冒泡,第1趟冒泡的效果是将数据值最大(或 最小)的元素交换到了最后的位置,即该数据排序的最终位置。 n个数据最多需要进行n1趟冒泡。
4.3.8 排序
2.选择排序 【案例4.12】用选择排序法将N 从待排序的n个数据的列表(R1, (N=7)个无序数据(9, 5, 7, 2, R2, R3,..., Rn)中选出最小的数 4, 8, 3)其按升序排列。 (按升序)或最大的数(按降 序),将它与R1交换;然后再 从余下的n-1个数中选出次小 (或次小)的元素与R2进行交 换;第i趟排序时(R1, R2,..., Ri-1) 已排好序,在当前无序的(Ri,..., Rn)中再选出最小(或最大) 的元素,将它与Ri元素交换,使 (R1, R2,..., Ri)成为有序。依此 类推,经过n-1趟排序后,全部 数据就递增(或递减)有序了。
18
logn
• 算法的复杂度常用数量级表示。 0 1 0 1 2 • 若设问题规模为n,则常见的复杂度有:
1 – O(1) 2 —— 常数阶 2 4 4 2 – O(n) 4 —— 线性阶 8 16 16
n
nlogn
n2
2n
– O(log n) —— 对数阶 3 8 24 64 – O(nlog n) —— 线性对数阶 4 – O(n216 64 256 ) —— 平方阶 n)—— 指数阶 – O ( 2 5 32 160 1024
“兔子繁殖问题”:假定一对小兔子一个月就可以长成大兔
子(一雄一雌),而一对大兔子每个月都会生出一对小兔子。 如果年初养了一对小兔子,到年底时将有多少对兔子? (假
设兔子没有死亡而且严格按照上述Fra Baidu bibliotek律长大与繁殖)
兔子繁殖的结果
月 1月 兔 小 兔 大 兔 合 计 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
用程序设计语言(Programming Language)表示算法就是用
计算机高级语言编写程序,程序是可以在计算机上经过编译、 连接、运行出结果的算法表示。
int max( int a, int b, int c) { int max; if(a > b)
max = a; else max = b; if(c > max) max = c; return max; } }
4.3.8 排序
3.插入排序 把n个待排序的数据分为两 部分:{R1,...,Ri1}为已排 好序的有序表,{Ri, Ri+1,...,Rn}为未排序的无 序表(初始时,令i=2)。 然后,把未排序部分的第1 个数据Ri依次与R1,...,Ri-1 比较,并插入到有序表的 适当位置上,使得{R1,..., Ri}变为一个新的有序表, 直到未排序表中的数据元 素全部插入到有序表中。 【案例4.13】用插入排序法将N (N=5)个无序数据(30, 16, 25, 17, 12)其按升序排列。 初始数据 第1步 第2步 第3步 第4步 [30] [16 [16 [16 [12 16 30] 25 17 16 25 25 30] 25 17 17 17 17 30] 25 12 12 12 12 30]
1
1 1 1
1
1 2
1
2 3
2
3 5
3
5 8
5
8 13
8
13 21
13
21 34
21
34 55
34
55 89
55
89 144
4.3.5 递归(续)
假设第N个月的兔子数目是F(N),可以得到如下公式:
1 N 2 F( N ) F( N 1 ) F( N 2 ) N 2
int main(void) { int a, b, c,Imax; scanf("%d%d%d",&a,&b,&c); Imax=max(a, b, c); printf("max=%d", Imax);
4.3.1 求和
【案例4.2】计算1~100的和。 思考1:如何计算m~n之间的偶 数或奇数之和。
到第10天早上想再吃时,见只剩下一个桃
子了。求猴子第一天共摘了多少个桃子?
4.3.4 迭代
【案例4.6】给定一个数n,判 断n是不是素数。
素数是指只能被1和它自己整 除的数。
可以证明,只需依次用2~
或2~ 之间的各数去除n就 可说明n是不是素数。
4.3.5 递归
递归是把一个复杂的问题逐层分解为最 简单问题,再由最简单问题逐层回代, 直到求出问题的解。
两个方程: a+b+c=100 5a+3b+c/3=100
(1) (2)
采用穷举法,依次对a,b,c取值范围内的各数一一试探,找出
满足方程(1)和(2)的组合。
流程图参见教材4.9。
4.3.4 迭代
迭代法又称递推法,它是从已知的初始 条件出发,逐次推出所要求的各中间结 果和最后结果。
【案例4.5】猴子吃桃问题。一只猴子第 一天摘下若干桃子,当即吃了一半,还不 过瘾,又多吃了一个,第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后 每天早上都吃了前一天剩下的一半零一个。
思考2:如何计算下式:
s 1
1 1 1 ... 12 123 1 2 3 ... n
开始 0=>sum 1=>k N k≤100 Y sum + k =>sum k+1 => k
结束
4.3.2 累乘
【案例4.3】计算10! 。 思考1:如何计算x 的流程图。
第四章 算法基础
• 利用计算机求解问题的一般过程:
需求分析 实际 问题
分析 抽象
系统设计
模型 建立
模型 分析
结构 设计
结构 分析
算法设计/分 析/模拟
编程 调试
编码 实现
结 果
测试 程序
2
4.3.2 流程图
常用传统流程图符号 求任意3个 正整数a、b、 c中的最大 者的流程图
4.2.4 程序设计语言
256
65535 4294967296
19
【案例4.6】年龄问题。有5个人坐在一起,问第5个人 多少岁?他说比第4个人大2岁。问第4个人的岁数,他
说比第3个人大2岁。问第3个人的岁数,他说比第2个人
大2岁。问第2个人,他说比第1个人大2岁。最后问第1 个人,他说是10岁。请问第5个人多大?
4.3.5 递归(续)
4.3.5 递归(续)
【案例4.7】Fibonacci数列。
思考2:如何计算下式:
sin( x ) x
n
x3
3!
x5
5!
x7
7!
x9
9!
4.3.3 穷举
【案例4.4】百钱买百鸡。我国古代的《张丘建算经》中有
一个著名的百鸡问题:鸡翁一,值钱五;鸡母一,值钱三; 鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何? 假设鸡翁、鸡母、鸡雏分别为a,b,c只,由题意可得如下