资源简介 (共39张PPT)第五章 数据结构与算法验收卷(四) 数据结构与算法(考试时间40分钟 满分50分)一、选择题(本题共12小题,每小题2分,共24分)1.下列有关数据结构的叙述中正确的是( )A解析 栈是限定在一端进行插入和删除的线性表,而另一端封闭,队列是限定仅在一端进行插入,在另一端进行删除的线性表,因此B选项错误;数据结构与算法有着密不可分的关系,数据结构的不同选择会影响算法的运行效率,因此,在设计算法需要考虑选用何种数据结构,故C选项错误;链式存储结构不一定优于线性表的线性存储结构,例如查找时,链式存储结构需要从头开始找,而线性表可直接通过下标找到,因此D选项错误;算法的设计和选择总是依赖于数据结构,它们两者是相辅相成的,因此,答案为A。A.算法的设计和选择总是依赖于数据结构B.栈是限定仅在一端进行插入,在另一端进行删除的线性表C.数据结构与算法是相互独立的,设计算法时不用考虑选用何种数据结构D.链式存储结构优于线性表的线性存储结构D2.递归算法的执行过程,一般来说,可先后分为递推阶段和( )解析 本题主要考查的是递归算法的执行过程。递归算法的执行过程分为递推和回归两个阶段,因此,答案为D。A.合并阶段 B.返回阶段C.回溯阶段 D.回归阶段A3.定义如下函数:def fn(n,num1,num2): if n==1: return num1 return fn(n-1,num2,num1+num2)下列说法正确的是( )A.该算法的时间复杂度是O(n)B.fn(10,1,2)的效果等价于1+2+3…+10C.fn(5,1,1)的结果是22D.fn(1,1,1)与fn(1,1,2)的返回结果不同解析 A选项函数将调用n次,因此时间复杂度是O(n)。B选项该函数的功能是实现斐波那契数列效果;C选项,fn(5,1,1)的结果是 5;D选项fn(1,1,1)与fn(1,1,2)的返回结果相同,都是 1。4.下列有两段程序:D关于两个程序段的说法,正确的是( )A.程序段 1 和程序段 2 的输出结果不相同B.程序段 1 和程序段 2 都采用了递归算法C.若问题规模为 n,程序段 2 的时间复杂度为O(n2)D.程序段 1 中,①和②两方框处中的数字 1 同时修改为 0,输出结果不变解析 本题考查递归和迭代、时间复杂度的计算阅读程序段 1,可知为递归算法实现 10+9+…+1 的和;阅读程序段 2,可知为迭代算法实现 1+2+…+10。因此两段程序输出结果相同,A 错误;程序段 2 为迭代算法,B 错误;程序段 2 中只有一层循环,时间复杂度为O(n),C 错误;修改程序段 1 代码,仅仅多递归一层函数,但是返回值+0 并不会影响输出结果,D 正确。D5.下列四段程序中,时间复杂度为O(n)的是( )解析 选项A、B中程序段的时间复杂度均为O(n2),因此,AB选项错误;选项C中程序段的时间复杂度均为O(log2n),因此C选项错误;选项D中程序段,外循环的时间复杂度均为O(log2n),内循环的执行次数为20+21+…+2k(k=log2n),根据等比数据求和公式,其和为n-1,即时间复杂度为O(n),因此答案为D。6.有如下Python 程序段:def fx(x):if x>3:ans=x*fx(x-1)elif x>1:ans=x+fx(x-1)else:ans=2return ansn=int(input(″please input n:″))print(fx(n))C程序执行时,输入n的值为6,则输出的结果为( )A.127 B.720 C.840 D.1440解析 本题主要考查的是递归算法。n=6,ans=6*5*4*f(3),而f(3)=3+2+f(1),已知f(1)=2,因此ans=840,故答案为C。DA.10,5,32,6,7,9,17,24,4B.10,5,32,6,7,9,4,17,24C.10,5,32,4,6,7,9,17,24D.4,10,5,32,17,9,24,6,7解析 冒泡的方向可以从前往后排序,后面的数据先有序;也可以从后往前排序,前面的数据先有序。第一遍排序后的结果把最小的数排到了最前面,因此可以推断是升序排列。A8.采用冒泡排序算法对某数据序列进行排序,第一轮排序后的结果是“2,8,6,3,5,7,9”,则第二轮排序需要交换的次数为( )A.4次或2次 B.4次或3次C.3次或1次 D.2次或1次解析 本题考查冒泡排序算法的相关知识。由第一轮数据“2,8,6,3,5,7,9”可知,采用冒泡排序对数据进行升序排序,但有两种可能,一种是从后往前的冒泡升序,则第二轮排序后的数据为“2,3,8,6,5,7,9”,交换2次,另一种是从前往后的冒泡升序,则第二轮排序后的数据为“2,6,3,5,7,8,9”,交换4次。9.有如下Python 程序段:a=[3,1,9,6]#将以空格隔开的输入数以列表的形式存储m=len(a)while m!=1: for i in range(m-1): if a[i]>a[i+1]: a[i],a[i+1]=a[i+1],a[i] m-=1print(a)A执行程序后,输出的结果为( )A.[1,3,6,9] B.[9,6,3,1]C.[1,6,3,9] D.[9,3,6,1]解析 本题考查冒泡排序的算法思想。从前往后冒泡实现升序排列,共排了m-1趟。C10.互不相等的 10 个列表元素 s[0]、s[1]、s[2]……s[9],有如下Python 程序段:n=10for i in range( 5 ) : for j in range(1,n-i): if s[j]>s[j-1]: s[j],s[j-1]=s[j-1],s[j]该程序段实现的是( )A.s[0]到 s[5]的降序排列 B.s[0]到 s[5]的升序排列C.s[5]到 s[9]的降序排列 D.s[5]到 s[9]的升序排列解析 本题考查冒泡排序算法思想。分析冒泡排序内循环的代码,是从左(前)向右(后)冒泡、降序。外循环只进行了5次,所以只有最后5个数(s[5]到 s[9])是有序的。11.某二分查找算法的Python程序段如下:i,j=0,24n=0while i<=j: m=(i+j+1)∥2 n=n+1 if key==a[m]: break if key>a[m]: i=m+1 else: j=m-1print(n)A解析 n的值为查找次数,7查找次数为2,其余查找次数是4。12.有如下Python程序段:import randoma=[1,3,3,8,8,10,10,14,16,17]key=random.randint(0,9)*2ans=-1; f=0L=0;R=9while L<=R: m=(L+R+1)∥2 if a[m]==key : ans=m break if a[m]>key:D R=m-1 f-=1 else: L=m+1 f+=1运行该程序段后,关于f和ans的结果,下列说法正确的是( )A.f可能的最小值为-3 B.f的值可能为-1C.ans的值可能为1 D.ans的值不可能为3解析 查找一个0-18之间的随机偶数key,画出相应的二叉树。A选项查找0,向左查找4次,f的值为-4。B选项向右查找1次,找到的数为3,不是偶数。C选项a[1]的值为3,不是偶数。D选项ans的值若为3,a[3]的值为8,而找到的第1个8的索引位置是4。二、非选择题(本题共3小题,共26分)13.(9分)根据申请人的QA和QB值,从m个申请人中挑选2人组队参加某挑战赛。条件一是2人的QA值都必须大于指定参数h;条件二是2人的QA值之差(较大值减较小值)小于h。在满足上述两个条件的所有2人组合中,挑选QB值之和最大的一个组合。(QA、QB和h的值均为正整数)编写Python程序,实现上述挑选功能。运行程序,输入参数h后,按QA值降序显示满足条件一的申请人信息,最后显示组队结果。程序运行界面如下图所示。请输入h的值:60符合条件一的申请人编号 QA值 QB值11 200 2510 139 1817 132 1014 99 219 83 201 67 348 66 24组队结果:1号,8号实现上述功能的Python程序如下,请回答下列问题:m=20 #m表示申请人个数id=qa=qb=[0]*mn=0 #变量n存储满足条件一的申请人个数s=″″#读取全部申请人的编号、QA和QB值,分别存入数组id、qa和qb,代码略h=int(input(″请输入h的值:″))n=mfor i in range(1,m):for j in range(m-1,i-1,-1):print(″编号″,″ QA值″,″QB值″)for i in range(n):print(″%3d%3d%3d″%(id[i],qa[i],qb[i]))maxx=0s=″没有满足条件的组合″#在满足条件的组合中,寻找QB值之和最大的组合,若有并列,只保留第一个for i in range(0,n-1):j=i+1while ②________________:if qb[i]+qb[j]>maxx: s=″组队结果:″+str(id[i])+″号,″+str(id[j])+″号″ ③________________j+=1print(s)(1)代码中加框处代码有错误请改正。加框处的代码应修改为_________________________________________________;(2)请在划线①②③处填入合适的代码。划线①处应填入的代码是____________________________________________;划线②处应填入的代码是_______________________________________________;划线③处应填入的代码是_____________________________________________。答案 (1)qa[j]>h and qa[j]>qa[j-1] 或qa[j]>qa[j-1](2)①n=i-1 ②j<=n-1 and abs(qa[i]-qa[j])解析 本题主要考查的是冒泡排序算法及其综合应用。(1)程序首先使用冒泡排序算法找出所有符合条件一的申请人,根据程序运行窗口可知数据是按QA值降序排序的,并将满足条件一的人数记录在变量n中。排序方式有两种,只将符合条件一的申请人进行降序排序,即加框处语句修改为qa[j]>h and qa[j]>qa[j-1],将所有申请人进行降序排序,即加框处语句修改为qa[j]>qa[j-1];(2)如果申请人不满足条件一,则排序可以提前结束,满足条件人数为i-1人,因此,程序划线①处代码为n=i-1;划线②处所在的循环语句的功能是使用枚举所有满足条件一、条件二的申请人进行组队,记录组队人QB值之和为最大的2个人,因此,②处代码为j<=n-1 and abs(qa[i]-qa[j])14.(7分)已知某水果店有 n 种水果,编号依次为 0~n-1,每种水果存量若干份。现为每位顾客分配两份不同种类且该顾客喜欢的水果,为合理分配,每位顾客分别勾选自己喜欢的水果编号,每人至少勾选两种(包含两种)以上水果。编写程序,根据水果存量数据以及顾客勾选数据,输出水果是否能分配完成。请回答下列问题:(1)若n为5,分配前每种水果存量数据如图a所示,顾客勾选数据如图b所示,则最后水果________(选填:能/不能)完成分配。(2)实现上述功能的部分 Python 程序如下,请在划线处填入合适的代码。def sort_f(x,y): for i in range(y): for j in range(①______): if num[fruit[j]] fruit[j],fruit[j+1]=fruit[j+1],fruit[j] return fruit#读取每种水果的存量数据,存入字典 num,例如:num={0:5,1:4,2:7,3:1,4:3,5:6},代码略。#读取每位顾客的勾选数据,存入列表 tch,例如:tch=[[0,3,5],[1,2]],代码略。fruit=[0,1,2,3,4,5] #存储水果编号fruit=sort_f(0,len(fruit)-1)②__________for k in range(len(tch)): c=[];p=0 while ③______________:if fruit[p] in tch[k]: num[fruit[p]]-=1 c.append(p)p+=1 if len(c)<2:flag=False break fruit=sort_f(c[0],2)if flag: print(″水果能分配完成!″)else: print(″水果不能分配完成!″)答案 (1)能 (2)①x,len(fruit)-i-1 ②flag=True ③len(c)<2 and num[fruit[p]]>0解析 (1)由于每位顾客分配两种水果,因此只勾选两种水果的顾客只分配给他们勾选的水果,剩余勾选2种以上的顾客,从剩余水果中选取还有存量的水果分配给他们。“1,2”“1,3”分配好后,剩余“5,2,6,0,3”,此时还有“0,3,4”“1,3,4”需从中选取分配,3号水果存量为0,不作考虑,0,1,4号水果存量均大于等于2,足够分配。因此能完成分配。(2)分配时,按照水果存量情况降序排列,将列表fruit中水果编号按水果存量降序排列。枚举每位顾客勾选数据,从列表fruit中从左往右,依次选取水果存量大的检测是否为该顾客喜欢水果,如果是则将此水果分配给该顾客,一共选取两种水果,用列表c存储分配的水果编号的索引。该顾客分配完成后,利用列表c存储的第一种水果编号索引作为再排序的起始位置,因为0~c[0]-1范围内的水果存量未变,只要对列表c中两个水果存量进行再排序,fruit按照最新存量进行降序排列,排2次即可。如果在分配过程中该顾客喜欢的水果无法分配两份,则分配失败。15.(10分)将十进制数 n(264≥n≥3)转化为 k(k≥2)进制数,若所有数位全为 1,则称 k 是 n 的一个好进制数。例如,十进制数 31 可以转化为(11)30 和(11111)2,因此 30 和 2 均是 31 的好进制数,其中 2 为 31 的最小好进制数。请回答下列问题:(1)十进制数“21”的最小好进制数 k 是________。(2)小明编写程序,找出 n 的最小好进制数 k,请在划线处填入合适的代码。n=int(input(″输入一个十进制数: ″))def check(k,m): #计算 m 位全为 1 的 k 进制的十进制值,如(111)2 的十进制值为 7 ans=0 for i in range(m): ①____________ return ansans=nfor length in range(2,65): ②____________ j=n-1 while i<=j: mid=(i+j)∥2 tmp=check(mid,length) if tmp==n: if ans>mid: ans=mid break elif ③____________: i=mid+1 else: j=mid-1print(n,″的最小好进制数是″,ans)答案 (1)4 (2)①ans=ans*k+1 或 ans=ans+k**i 或 ans=ans+k**(m-i-1) ②i=2 ③tmp解析 本题考查进制转换、对分查找等相关知识。(1)21=16+4+1=(111)4,故最小的好进制数是4。①空实现 k 进制、m 位 1 转换为十进制数的过程,此处可采用累乘相加,即 ans=ans*k+1或 ans=ans+k**(m-i-1)等。②处填 i 的初始值。已知函数 check 的第 1 个参数为进制,第 2 个参数为 1 的位数,结合 tmp=check(mid,length)这一句,可知 mid 为进制。本题的进制最小值为 2,进制最大值为 n-1(例如 64=63+1=(11)63)。③外循环枚举所有可能的位数,循环中采用对分法测试结果,即先找到进制的中位数 mid,计算 mid 进制下,length 位个 1 转换为十进制数的 tmp。若 tmp==n,则保留 mid 的最小值,进入下一轮大循环,查找更长的位数(位数越长意味着进制越小)。若 tmp(考试时间40分钟 满分50分)一、选择题(本题共12小题,每小题2分,共24分)1.下列有关数据结构的叙述中正确的是( )A.算法的设计和选择总是依赖于数据结构B.栈是限定仅在一端进行插入,在另一端进行删除的线性表C.数据结构与算法是相互独立的,设计算法时不用考虑选用何种数据结构D.链式存储结构优于线性表的线性存储结构2.递归算法的执行过程,一般来说,可先后分为递推阶段和( )A.合并阶段 B.返回阶段C.回溯阶段 D.回归阶段3.定义如下函数:def fn(n,num1,num2): if n==1: return num1 return fn(n-1,num2,num1+num2)下列说法正确的是( )A.该算法的时间复杂度是O(n)B.fn(10,1,2)的效果等价于1+2+3…+10C.fn(5,1,1)的结果是22D.fn(1,1,1)与fn(1,1,2)的返回结果不同4.下列有两段程序:#程序段1 def rec(n): if : #① #② else: return n+rec(n-1) print(rec(10)) #程序段2 def rec(n): ans=0 for i in range(1,n+1,1): ans=ans+i return ans print(rec(10))关于两个程序段的说法,正确的是( )A.程序段 1 和程序段 2 的输出结果不相同B.程序段 1 和程序段 2 都采用了递归算法C.若问题规模为 n,程序段 2 的时间复杂度为O(n2)D.程序段 1 中,①和②两方框处中的数字 1 同时修改为 0,输出结果不变5.下列四段程序中,时间复杂度为O(n)的是( )6.有如下Python 程序段:def fx(x):if x>3:ans=x*fx(x-1)elif x>1:ans=x+fx(x-1)else:ans=2return ansn=int(input(″please input n:″))print(fx(n))程序执行时,输入n的值为6,则输出的结果为( )A.127 B.720 C.840 D.14407.有一个数组,采用冒泡排序,第一遍排序后的结果为:4,10,5,32,6,7,9,17,24该数组的原始顺序不可能的是( )A.10,5,32,6,7,9,17,24,4B.10,5,32,6,7,9,4,17,24C.10,5,32,4,6,7,9,17,24D.4,10,5,32,17,9,24,6,78.采用冒泡排序算法对某数据序列进行排序,第一轮排序后的结果是“2,8,6,3,5,7,9”,则第二轮排序需要交换的次数为( )A.4次或2次 B.4次或3次C.3次或1次 D.2次或1次9.有如下Python 程序段:a=[3,1,9,6]#将以空格隔开的输入数以列表的形式存储m=len(a)while m!=1: for i in range(m-1): if a[i]>a[i+1]: a[i],a[i+1]=a[i+1],a[i] m-=1print(a)执行程序后,输出的结果为( )A.[1,3,6,9] B.[9,6,3,1]C.[1,6,3,9] D.[9,3,6,1]10.互不相等的 10 个列表元素 s[0]、s[1]、s[2]……s[9],有如下Python 程序段:n=10for i in range( 5 ) : for j in range(1,n-i): if s[j]>s[j-1]: s[j],s[j-1]=s[j-1],s[j]该程序段实现的是( )A.s[0]到 s[5]的降序排列 B.s[0]到 s[5]的升序排列C.s[5]到 s[9]的降序排列 D.s[5]到 s[9]的升序排列11.某二分查找算法的Python程序段如下:i,j=0,24n=0while i<=j: m=(i+j+1)∥2 n=n+1 if key==a[m]: break if key>a[m]: i=m+1 else: j=m-1print(n)列表a中各元素值依次为1~25,若查找键key为下列选项的值,程序段执行后,输出结果与其他三项不同的是( )A.7 B.12 C.19 D.2212.有如下Python程序段:import randoma=[1,3,3,8,8,10,10,14,16,17]key=random.randint(0,9)*2ans=-1; f=0L=0;R=9while L<=R: m=(L+R+1)∥2 if a[m]==key : ans=m break if a[m]>key: R=m-1 f-=1 else: L=m+1 f+=1运行该程序段后,关于f和ans的结果,下列说法正确的是( )A.f可能的最小值为-3B.f的值可能为-1C.ans的值可能为1D.ans的值不可能为3二、非选择题(本题共3小题,共26分)13.(9分)根据申请人的QA和QB值,从m个申请人中挑选2人组队参加某挑战赛。条件一是2人的QA值都必须大于指定参数h;条件二是2人的QA值之差(较大值减较小值)小于h。在满足上述两个条件的所有2人组合中,挑选QB值之和最大的一个组合。(QA、QB和h的值均为正整数)编写Python程序,实现上述挑选功能。运行程序,输入参数h后,按QA值降序显示满足条件一的申请人信息,最后显示组队结果。程序运行界面如下图所示。请输入h的值:60 符合条件一的申请人 编号 QA值 QB值 11 200 25 10 139 18 17 132 10 14 99 21 9 83 20 1 67 34 8 66 24 组队结果:1号,8号实现上述功能的Python程序如下,请回答下列问题:m=20 #m表示申请人个数id=qa=qb=[0]*mn=0 #变量n存储满足条件一的申请人个数s=″″#读取全部申请人的编号、QA和QB值,分别存入数组id、qa和qb,代码略h=int(input(″请输入h的值:″))n=mfor i in range(1,m):for j in range(m-1,i-1,-1): if : qa[j],qa[j-1]=qa[j-1],qa[j] qb[j],qb[j-1]=qb[j-1],qb[j] id[j],id[j-1]=id[j-1],id[j]if qa[j-1]<=h: ①________________ breakprint(″符合条件一的申请人″)print(″编号″,″ QA值″,″QB值″)for i in range(n):print(″%3d%3d%3d″%(id[i],qa[i],qb[i]))maxx=0s=″没有满足条件的组合″#在满足条件的组合中,寻找QB值之和最大的组合,若有并列,只保留第一个for i in range(0,n-1):j=i+1while ②________________:if qb[i]+qb[j]>maxx: s=″组队结果:″+str(id[i])+″号,″+str(id[j])+″号″ ③________________j+=1print(s)(1)代码中加框处代码有错误请改正。加框处的代码应修改为_________________________________________________;(2)请在划线①②③处填入合适的代码。划线①处应填入的代码是________________________________________________;划线②处应填入的代码是_______________________________________________;划线③处应填入的代码是________________________________________________。14.(7分)已知某水果店有 n 种水果,编号依次为 0~n-1,每种水果存量若干份。现为每位顾客分配两份不同种类且该顾客喜欢的水果,为合理分配,每位顾客分别勾选自己喜欢的水果编号,每人至少勾选两种(包含两种)以上水果。编写程序,根据水果存量数据以及顾客勾选数据,输出水果是否能分配完成。请回答下列问题:(1)若n为5,分配前每种水果存量数据如图a所示,顾客勾选数据如图b所示,则最后水果________(选填:能/不能)完成分配。(2)实现上述功能的部分 Python 程序如下,请在划线处填入合适的代码。def sort_f(x,y): for i in range(y): for j in range(①______): if num[fruit[j]] fruit[j],fruit[j+1]=fruit[j+1],fruit[j] return fruit#读取每种水果的存量数据,存入字典 num,例如:num={0:5,1:4,2:7,3:1,4:3,5:6},代码略。#读取每位顾客的勾选数据,存入列表 tch,例如:tch=[[0,3,5],[1,2]],代码略。fruit=[0,1,2,3,4,5] #存储水果编号fruit=sort_f(0,len(fruit)-1)②__________for k in range(len(tch)): c=[];p=0 while ③______________:if fruit[p] in tch[k]: num[fruit[p]]-=1 c.append(p)p+=1 if len(c)<2:flag=False break fruit=sort_f(c[0],2)if flag: print(″水果能分配完成!″)else: print(″水果不能分配完成!″)15.(10分)将十进制数 n(264≥n≥3)转化为 k(k≥2)进制数,若所有数位全为 1,则称 k 是 n 的一个好进制数。例如,十进制数 31 可以转化为(11)30 和(11111)2,因此 30 和 2 均是 31 的好进制数,其中 2 为 31 的最小好进制数。请回答下列问题:(1)十进制数“21”的最小好进制数 k 是________。(2)小明编写程序,找出 n 的最小好进制数 k,请在划线处填入合适的代码。n=int(input(″输入一个十进制数: ″))def check(k,m): #计算 m 位全为 1 的 k 进制的十进制值,如(111)2 的十进制值为 7 ans=0 for i in range(m): ①____________ return ansans=nfor length in range(2,65): ②____________ j=n-1 while i<=j: mid=(i+j)∥2 tmp=check(mid,length) if tmp==n: if ans>mid: ans=mid break elif ③____________: i=mid+1 else: j=mid-1print(n,″的最小好进制数是″,ans)验收卷(四) 数据结构与算法1.A [栈是限定在一端进行插入和删除的线性表,而另一端封闭,队列是限定仅在一端进行插入,在另一端进行删除的线性表,因此B选项错误;数据结构与算法有着密不可分的关系,数据结构的不同选择会影响算法的运行效率,因此,在设计算法需要考虑选用何种数据结构,故C选项错误;链式存储结构不一定优于线性表的线性存储结构,例如查找时,链式存储结构需要从头开始找,而线性表可直接通过下标找到,因此D选项错误;算法的设计和选择总是依赖于数据结构,它们两者是相辅相成的,因此,答案为A。]2.D [本题主要考查的是递归算法的执行过程。递归算法的执行过程分为递推和回归两个阶段,因此,答案为D。]3.A [A选项函数将调用n次,因此时间复杂度是O(n)。B选项该函数的功能是实现斐波那契数列效果;C选项,fn(5,1,1)的结果是 5;D选项fn(1,1,1)与fn(1,1,2)的返回结果相同,都是 1。]4.D [本题考查递归和迭代、时间复杂度的计算阅读程序段 1,可知为递归算法实现 10+9+…+1 的和;阅读程序段 2,可知为迭代算法实现 1+2+…+10。因此两段程序输出结果相同,A 错误;程序段 2 为迭代算法,B 错误;程序段 2 中只有一层循环,时间复杂度为 O(n),C 错误;修改程序段 1 代码,仅仅多递归一层函数,但是返回值+0 并不会影响输出结果,D 正确。]5.D [选项A、B中程序段的时间复杂度均为O(n2),因此,AB选项错误;选项C中程序段的时间复杂度均为O(log2n),因此C选项错误;选项D中程序段,外循环的时间复杂度均为O(log2n),内循环的执行次数为20+21+…+2k(k=log2n),根据等比数据求和公式,其和为n-1,即时间复杂度为O(n),因此答案为D。]6.C [本题主要考查的是递归算法。n=6,ans=6*5*4*f(3),而f(3)=3+2+f(1),已知f(1)=2,因此ans=840,故答案为C。]7.D [冒泡的方向可以从前往后排序,后面的数据先有序;也可以从后往前排序,前面的数据先有序。第一遍排序后的结果把最小的数排到了最前面,因此可以推断是升序排列。]8.A [本题考查冒泡排序算法的相关知识。由第一轮数据“2,8,6,3,5,7,9”可知,采用冒泡排序对数据进行升序排序,但有两种可能,一种是从后往前的冒泡升序,则第二轮排序后的数据为“2,3,8,6,5,7,9”,交换2次,另一种是从前往后的冒泡升序,则第二轮排序后的数据为“2,6,3,5,7,8,9”,交换4次。]9.A [本题考查冒泡排序的算法思想。从前往后冒泡实现升序排列,共排了m-1趟。]10.C [本题考查冒泡排序算法思想。分析冒泡排序内循环的代码,是从左(前)向右(后)冒泡、降序。外循环只进行了5次,所以只有最后5个数(s[5]到 s[9])是有序的。]11.A [n的值为查找次数,7查找次数为2,其余查找次数是4。]12.D [查找一个0-18之间的随机偶数key,画出相应的二叉树。A选项查找0,向左查找4次,f的值为-4。B选项向右查找1次,找到的数为3,不是偶数。C选项a[1]的值为3,不是偶数。D选项ans的值若为3,a[3]的值为8,而找到的第1个8的索引位置是4。]13.(1)qa[j]>h and qa[j]>qa[j-1] 或qa[j]>qa[j-1](2)①n=i-1 ②j<=n-1 and abs(qa[i]-qa[j])j<=n-1 and qa[i]-qa[j]解析 本题主要考查的是冒泡排序算法及其综合应用。(1)程序首先使用冒泡排序算法找出所有符合条件一的申请人,根据程序运行窗口可知数据是按QA值降序排序的,并将满足条件一的人数记录在变量n中。排序方式有两种,只将符合条件一的申请人进行降序排序,即加框处语句修改为qa[j]>h and qa[j]>qa[j-1],将所有申请人进行降序排序,即加框处语句修改为qa[j]>qa[j-1];(2)如果申请人不满足条件一,则排序可以提前结束,满足条件人数为i-1人,因此,程序划线①处代码为n=i-1;划线②处所在的循环语句的功能是使用枚举所有满足条件一、条件二的申请人进行组队,记录组队人QB值之和为最大的2个人,因此,②处代码为j<=n-1 and abs(qa[i]-qa[j])14.(1)能 (2)①x,len(fruit)-i-1 ②flag=True ③len(c)<2 and num[fruit[p]]>0解析 (1)由于每位顾客分配两种水果,因此只勾选两种水果的顾客只分配给他们勾选的水果,剩余勾选2种以上的顾客,从剩余水果中选取还有存量的水果分配给他们。“1,2”“1,3”分配好后,剩余“5,2,6,0,3”,此时还有“0,3,4”“1,3,4”需从中选取分配,3号水果存量为0,不作考虑,0,1,4号水果存量均大于等于2,足够分配。因此能完成分配。(2)分配时,按照水果存量情况降序排列,将列表fruit中水果编号按水果存量降序排列。枚举每位顾客勾选数据,从列表fruit中从左往右,依次选取水果存量大的检测是否为该顾客喜欢水果,如果是则将此水果分配给该顾客,一共选取两种水果,用列表c存储分配的水果编号的索引。该顾客分配完成后,利用列表c存储的第一种水果编号索引作为再排序的起始位置,因为0~c[0]-1范围内的水果存量未变,只要对列表c中两个水果存量进行再排序,fruit按照最新存量进行降序排列,排2次即可。如果在分配过程中该顾客喜欢的水果无法分配两份,则分配失败。15.(1)4 (2)①ans=ans*k+1 或 ans=ans+k**i 或 ans=ans+k**(m-i-1) ②i=2 ③tmp解析 本题考查进制转换、对分查找等相关知识。(1)21=16+4+1=(111)4,故最小的好进制数是4。①空实现 k 进制、m 位 1 转换为十进制数的过程,此处可采用累乘相加,即 ans=ans*k+1或 ans=ans+k**(m-i-1)等。②处填 i 的初始值。已知函数 check 的第 1 个参数为进制,第 2 个参数为 1 的位数,结合 tmp=check(mid,length)这一句,可知 mid 为进制。本题的进制最小值为 2,进制最大值为 n-1(例如 64=63+1=(11)63)。③外循环枚举所有可能的位数,循环中采用对分法测试结果,即先找到进制的中位数 mid,计算 mid 进制下,length 位个 1 转换为十进制数的 tmp。若 tmp==n,则保留 mid 的最小值,进入下一轮大循环,查找更长的位数(位数越长意味着进制越小)。若 tmp 展开更多...... 收起↑ 资源列表 验收卷(四) 数据结构与算法.docx 验收卷(四) 数据结构与算法.pptx