1、7-1算法及程序实现知识点一、枚举算法及程序实现枚举算法基本思想是根据问题本身的性质,一一列举出该问题所有可能的情况,并根据题目的条件逐个作出判断,从中挑出符合要求的解。枚举算法属于搜索策略,适用于解变量确定的连续值域的问题。设计枚举算法时要在尽可能小的范围内罗列出所有可能的情况,不能遗漏,也不能重复。例:假如我有一个 QQ 的密码是一位数字,如果让同学们来破解的话,会把 0 到 9 十个数字都试一遍,找到密码,这种方法使用的算法就是枚举算法。枚举算法解题的主要方法,必须把所有的可能情况都一一列出来,这种可能情况,一般通过循环列举出来。例如课本例题,一份单据被抹除的数字的推算问题。可能的情况有
2、 25006 至 25996 一共 100 种,通过循环把这一百种情况全部列出来,在循环列出来的过程对,对每一种情况进行比较,是否符合要求。n=25006+j*100,j 的范围为 0 至 99,此处列出来的表达式只有一个未知数 j,所以只需用一重循环就够了。DO 循环c=0 如果需要统计符合要求的单据的张数的话,用 c 做计数器j=0do while ji then 把最小数据与待排序数据中的第一个交换kt=d(j)d(j)=d(k)d(k)=ktend ifnext i 结束第一重循环例1:选择排序的基本思想是在参与排序的所有数组元素中找出最小(或最大) 的元素,使它与第一个元素互换位置,
3、然后再在余下的元素中重复上述过程。有一组数,顺序是“2、6、4、1”,用选择排序法将这组数从大到小排序,第一次交换数据后的顺序是:(A) 6、2、1、4 (B) 6、4、2、1 (C ) 6、1、 2、4 (D) 6、2、4、1四、查找算法及程序实现1顺序查找顺序查找的基本思想是从第一个数据开始,按数据的顺序逐个将数据与给定的值进行比较,若某个数据和给定值相等,则查找成功,找到所查数据的位置;反之,查找不成功。流程图:d(1)=65;d(2)=97;d(3)=76;d(4)=13;d(5)=27;d(6)=49;d(7)=58查找 key=49程序实现:For i=1 to 7If d(i)=
4、key then输出找到是第 d(i)个Exit forEnd ifNext i7-72对分查找对分查找的基本思想是在有序的数据列中,首先将要查找的数据与有序数组内处于中间位置的数据进行比较,如果两者相等,则查找成功;否则根据数组元素的有序性,就可确定该数据应该在数组的前半部分还是后半部分继续进行查找;在新确定的范围内,继续按上述方法进行查找,直到找到要查找的数据,使查找成功,或直到子表不存在,查找不成功。对分查找的条件是被查找的数据必须是有序的。对分(二分)查找过程:d(1)=13;d(2)=27;d(3)=49;d(4)=58;d(5)=76;d(6)=97;d(7)=102;d(8)=1
5、38;d(9)=202查找 k=138d(1)=13;d(2)=27;d(3)=49;d(4)=58;d(5)=76;d(6)=97;d(7)=102;d(8)=138;d(9)=202第一次 k 与 d(fix(1+9)/2 ) )=d(5)比较,比 d(5)大,下次在 d(5)的右边找d(1)=13;d(2)=27;d(3)=49;d(4)=58;d(5)=76;d(6)=97;d(7)=102;d(8)=138;d(9)=202第二次 k 与 d(5)右边的 d(fix(6+9)/2 ) )=d(7)比较,比 d(7)大,下次在 d(7)的右边找d(1)=13;d(2)=27;d(3)=
6、49;d(4)=58;d(5)=76;d(6)=97;d(7)=102;d(8)=138;d(9)=202第三次 k 与 d(7)右边的 d(fix(8+9)/2 ) )=d(8)比较,与 d(8)相等,找到。依次被访问进行比较的数字为:d(5) 、d(7) 、d(8)流程图:课本上的查找函数:Function search(key as integer) as integeri=1 i 代表待查找数列中的第一个元素的下标,刚开始时是 1j=9 j 代表待查找数列中的最后一个元素的下标,刚开始时是 9(因为一共 9 个元素)7-8nc=0 统计查找次数do while i=j 第一个元素的下标
7、要小于或等于最后一个元素的下标,否则待查找数列就不存在了nc=nc+1 每找一次增加一次m=fix(i+j )/2 求等查找数列中间数的下标if d(m)=key then 判断是否找到了search=m 找到了把下标存到变量 search 中exit function 退出函数end ifif keyd(m) then 要找的数 key 比现在比较的中间数小j=m-1 要找的数 key 比现在比较的中间数小,在待查找数列的左边找,所以新的待查找数列的最后一个元素的下标是现在中间元素下标 m 左边的一个elsei=m+1 要找的数 key 比现在比较的中间数小,在待查找数列的右边找,所以新的待查找数列的最后一个元素的下标是现在中间元素下标 m 右边的一个end ifloopsearch=0end function