1、算法第25章复习算法的程序实现本章重点:枚举算法、解析算法、冒泡排序、选择排序、顺序查找和对分查找的基本思想,以及利用这些算法进行程序设计,解决实际问题。本章难点:冒泡排序、选择排序和对分查找的算法及程序实现。注意点:(1)使用枚举算法,要求列举出所有可能的情况,不能遗漏,也不能重复。另外使用枚举算法计算容量较大,需要强调程序优化措施,提高计算机的效率。(2) 对分查找算法效率高,但要求数组中的数据是有序的。枚举算法:就是按问题本身的性质,一一列举该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,如是,就采纳这个解,否则就抛弃它实例:自行车胎坏掉的时候,修车师傅检查坏
2、掉的位置,就是一个枚举算法,他选定某一个位置为起始位置,然后按顺序一块块的检查过来,直到找到坏掉的位置,需要注意的问题是:找到一个坏掉的位置后,还要继续找吗?为了安全起见,建议继续找由此,在使用枚举算法的时候的注意事项,即要把所有可能的情况都找出来,否则有可能会漏掉答案。典型实例: 水仙花数:如果一个三位数等于它的每个数字的立方和,则此数称为“水仙花”数,如:153=13+53+33 程序段如下:For i = 100 To 999 a = i 100 b = i 10 Mod 10 c = i Mod 10 If a 3 + b 3 + c 3 = i Then List1.AddItem
3、(Str(i) sum = sum + 1 End If Next i其它参考实例:百钱买百鸡,孙子算经,纸币问题,包装问题解析算法及程序实现解析算法的基本思想是用解析的方法找出表示问题的前提条件与所求结果之间关系的数学表达式,并通过数学表达式的计算来实现问题的求解。例题1:求解一元二次方程1、分析问题 从我们通常解题的步骤来分析(问题的前提条件abc与所求结果x的关系的数学表达式) x=2、将数学表达式转为计算机语言形式dim x1,x2 as double dim a,b,c AS Double if b*b-4*a*c=0 then x1=(-b+sqr(b*b-4*a*c)/(2*a)
4、 x2=(-b-sqr(b*b-4*a*c)/(2*a) text1.text =“x1=“+str(x1) text2.text =“x2=“+str(x2) else print “方程无解”end if例题2:火车托运行李,要根据行李的重量按下列标准收费:若不超过50千克,按每千克0.35元收费,若超过50千克,超过部分则按每千克0.5元收费。输入托运行李的重量,计算并输出托运行李的费用。下面程序若用于实现上述目标,则划线红色加粗处的语句应更改为_sub command1_click()dim x as doublex=val(text1.text)if x50 then text2.t
5、ext=str(0.35*x)else text2.text=str(0.5*x)end ifend sub答案:划线处的填空内容依次更改为x=50和str(50*0.35+0.5*(x-50)其它参考实例:储藏问题,人口问题排序算法的分析及实现-冒泡排序和选择排序排序的意义: 排序是为了将一组杂乱的数据变成一组有序的数据。(递增或递减)冒泡排序: 理解:冒泡排序是在一列数据中把较小的数据逐次向上推移的一种排序技术。数组: 为了存储一组数据,我们需要用到数组变量例如 dim d(1 to 1000) as integer冒泡排序 用数组来存储一系列同类型的数据, 然后调整数组中的元素 例如:
6、dim d(1 to 4) as integer 定义一个数组变量d生成随机数,显示在list1 Private Sub Command2_Click() 产生8个随机数 Randomize 随机数初始化 List1.Clear 原始数据清空 List2.Clear 将排序后的列表数据清空 For i = 1 To 8 d(i) = Int(Rnd * 1000) Rnd 函数返回的随机数介于 0 和 1 之间,可等于 0,但不等于 1 List1.AddItem Str(d(i) 将数据显示到原始数据列表中 Next End Sub冒泡排序算法 Private Sub Command1_Cl
7、ick() 对8个数进行冒泡法排序 List2.Clear 将排序后的列表数据清空 For i = 1 To 7 For j = 8 To i + 1 Step -1 If d(j) d(j) Then Min = j Next j If Min i Then 如果最小的数所在的位置不是i,则交换 k = d(i) d(i) = d(Min) d(Min) = k End If Next i For i = 1 To 8 List2.AddItem Str(d(i) 在列表2中显示排序后的数据 Next i End Sub选择排序和冒泡排序的比较以n个数据为例交换次数执行时间冒泡O(n2)长选
8、择O(n)短查找算法顺序查找和对分查找查找算法查找是一种查询数据的技术,其目标是能以比较少的步聚和较短的时间找到所需的对象顺序查找的基本思想 是从第一个数据开始,按数据的顺序逐个将数据与给定的值进行比较。若某个数据和给定的值相等,则查找成功,找到所查数据的位置;反之,查找不成功。顺序查找转化成程序Private Sub Command6_Click() 顺序查找Key = Val(Text2.Text)For i = 1 To num If d(i) = Key Then Label5.Caption = 在数组的 + Str(i) + 位置中 Exit For End IfNextIf i
9、= num + 1 Then Label5.Caption = 在数组中没有找到 + Str(Key)End IfEnd Sub对分查找的基本思想对分查找的前提是数据已经有序(以递增为例),然后把待查找的数据与数组中间位置的数比较,如果比中间位置的数大,在数组的后半部分继续查找,否则在数组的前半部分查找,继续对分查找,直到找到待查找的数在数组中的位置或数组已无法对分(1)过程:代码分析command4的click过程比较 顺序查找是一种基本、简单的查找算法,但查找的效率往往过低; 对分查找时每次都把查找范围缩小一半 对分查找算法数据次数较少,效率较高,但它要求数组中的数据是有序的。顺序查找与对分查找比较是否需要事先排序平均查找次数顺序查找不需要(n+1)/2多对分查找需要Log2n少
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1