算法第25章复习.docx
《算法第25章复习.docx》由会员分享,可在线阅读,更多相关《算法第25章复习.docx(13页珍藏版)》请在冰豆网上搜索。
算法第25章复习
算法的程序实现
本章重点:
枚举算法、解析算法、冒泡排序、选择排序、顺序查找和对分查找的基本思想,以及利用这些算法进行程序设计,解决实际问题。
本章难点:
冒泡排序、选择排序和对分查找的算法及程序实现。
注意点:
(1)使用枚举算法,要求列举出所有可能的情况,不能遗漏,也不能重复。
另外使用枚举算法计算容量较大,需要强调程序优化措施,提高计算机的效率。
(2)对分查找算法效率高,但要求数组中的数据是有序的。
枚举算法:
就是按问题本身的性质,一一列举该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,如是,就采纳这个解,否则就抛弃它.
实例:
自行车胎坏掉的时候,修车师傅检查坏掉的位置,就是一个枚举算法,他选定某一个位置为起始位置,然后按顺序一块块的检查过来,直到找到坏掉的位置,……
需要注意的问题是:
找到一个坏掉的位置后,还要继续找吗?
为了安全起见,建议继续找……
由此,在使用枚举算法的时候的注意事项,即要把所有可能的情况都找出来,否则有可能会漏掉答案。
典型实例:
水仙花数:
如果一个三位数等于它的每个数字的立方和,则此数称为“水仙花”数,如:
153=13+53+33
程序段如下:
Fori=100To999
a=i\100
b=i\10Mod10
c=iMod10
Ifa^3+b^3+c^3=iThen
List1.AddItem(Str(i))
sum=sum+1
EndIf
Nexti
其它参考实例:
百钱买百鸡,孙子算经,纸币问题,包装问题
解析算法及程序实现
解析算法的基本思想是用解析的方法找出表示问题的前提条件与所求结果之间关系的数学表达式,并通过数学表达式的计算来实现问题的求解。
例题1:
求解一元二次方程
1、分析问题
从我们通常解题的步骤来分析
(问题的前提条件abc与所求结果x的关系的数学表达式)
x=
2、将数学表达式转为计算机语言形式
dimx1,x2asdouble
dima,b,cASDouble
ifb*b-4*a*c>=0then
x1=(-b+sqr(b*b-4*a*c))/(2*a)
x2=(-b-sqr(b*b-4*a*c))/(2*a)
text1.text=“x1=“+str(x1)
text2.text=“x2=“+str(x2)
else
print“方程无解”
endif
例题2:
火车托运行李,要根据行李的重量按下列标准收费:
若不超过50千克,按每千克0.35元收费,若超过50千克,超过部分则按每千克0.5元收费。
输入托运行李的重量,计算并输出托运行李的费用。
下面程序若用于实现上述目标,则划线红色加粗处的语句应更改为_________
subcommand1_click()
dimxasdouble
x=val(text1.text)
ifx>50then
text2.text=str(0.35*x)
else
text2.text=str(0.5*x)
endif
endsub
答案:
划线处的填空内容依次更改为x<=50和str(50*0.35+0.5*(x-50))
其它参考实例:
储藏问题,人口问题
排序算法的分析及实现----冒泡排序和选择排序
排序的意义:
排序是为了将一组杂乱的数据变成一组有序的数据。
(递增或递减)
冒泡排序:
理解:
冒泡排序是在一列数据中把较小的数据逐次向上推移的一种排序技术。
数组:
为了存储一组数据,我们需要用到数组变量
例如dimd(1to1000)asinteger
冒泡排序
⏹用数组来存储一系列同类型的数据,然后调整数组中的元素
⏹例如:
dimd(1to4)asinteger‘定义一个数组变量d
生成随机数,显示在list1
⏹PrivateSubCommand2_Click()'产生8个随机数
⏹Randomize'随机数初始化
⏹List1.Clear'原始数据清空
⏹List2.Clear'将排序后的列表数据清空
⏹Fori=1To8
⏹d(i)=Int(Rnd*1000)
⏹'Rnd函数返回的随机数介于0和1之间,可等于0,但不等于1
⏹List1.AddItemStr(d(i))'将数据显示到原始数据列表中
⏹Next
⏹EndSub
冒泡排序算法
⏹PrivateSubCommand1_Click()'对8个数进行冒泡法排序
⏹List2.Clear'将排序后的列表数据清空
⏹Fori=1To7
⏹Forj=8Toi+1Step-1
⏹Ifd(j)⏹k=d(j):
d(j)=d(j-1):
d(j-1)=k
⏹EndIf
⏹Nextj
⏹Nexti
⏹Fori=1To8
⏹List2.AddItemStr(d(i))'在列表2中显示排序后的数据
⏹Nexti
⏹EndSub
选择排序
选择排序(递增)的方法是
找出数组元素中最小的数据,使它与第一个元素中的数据交换位置
在余下的元素中继续找最小的元素,与第二个元素中的数据交换位置
……………………
算法演示
第1遍选择
第2遍选择
分析
程序实现
生成随机数,显示在list1
⏹PrivateSubCommand2_Click()'产生8个随机数
⏹Randomize'随机数初始化
⏹List1.Clear'原始数据清空
⏹List2.Clear'将排序后的列表数据清空
⏹Fori=1To8
⏹d(i)=Int(Rnd*1000)
⏹'Rnd函数返回的随机数介于0和1之间,可等于0,但不等于1
⏹List1.AddItemStr(d(i))'将数据显示到原始数据列表中
⏹Next
⏹EndSub
选择法排序
⏹PrivateSubCommand1_Click()'对8个数进行选择法排序
⏹List2.Clear'将排序后的列表数据清空
⏹Fori=1To7'选择第i个最小的数
⏹Min=i
⏹Forj=i+1To8'如果找到更小的,用min记住它的编号
⏹Ifd(Min)>d(j)ThenMin=j
⏹Nextj
⏹IfMin<>iThen'如果最小的数所在的位置不是i,则交换
⏹k=d(i)
⏹d(i)=d(Min)
⏹d(Min)=k
⏹EndIf
⏹Nexti
⏹Fori=1To8
⏹List2.AddItemStr(d(i))'在列表2中显示排序后的数据
⏹Nexti
⏹EndSub
选择排序和冒泡排序的比较
以n个数据为例
交换次数
执行时间
冒泡
O(n2)
长
选择
O(n)
短
查找算法——顺序查找和对分查找
查找算法
查找是一种查询数据的技术,其目标是能以比较少的步聚和较短的时间找到所需的对象
顺序查找的基本思想
是从第一个数据开始,按数据的顺序逐个将数据与给定的值进行比较。
若某个数据和给定的值相等,则查找成功,找到所查数据的位置;反之,查找不成功。
顺序查找
转化成程序
PrivateSubCommand6_Click()'顺序查找
Key=Val(Text2.Text)
Fori=1Tonum
Ifd(i)=KeyThen
Label5.Caption="在数组的"+Str(i)+"位置中"
ExitFor
EndIf
Next
Ifi=num+1Then
Label5.Caption="在数组中没有找到"+Str(Key)
EndIf
EndSub
对分查找的基本思想
对分查找的前提是数据已经有序(以递增为例),然后把待查找的数据与数组中间位置的数比较,如果比中间位置的数大,在数组的后半部分继续查找,否则在数组的前半部分查找,继续对分查找,直到找到待查找的数在数组中的位置或数组已无法对分
(1)过程:
代码分析command4的click过程
比较
⏹顺序查找是一种基本、简单的查找算法,但查找的效率往往过低;
⏹对分查找时每次都把查找范围缩小一半
⏹对分查找算法数据次数较少,效率较高,但它要求数组中的数据是有序的。
顺序查找与对分查找比较
是否需要
事先排序
平均查找次数
顺序查找
不需要
(n+1)/2
多
对分查找
需要
Log2n
少