资源简介 / 让教学更有效 精品试卷 | 信息第12课 课后练习(学生用)班级:____________ 姓名:____________ 得分:__________一、填空(每空 3 分,共 24 分)1.顺序查找最坏情况下要比较 ______ 次(列表有 n 个元素)。2.二分查找的前提条件是:数据必须已经 ______________。3.二分查找中,中间位置的计算式是 mid = ______________。4.当 a[mid] < target 时,应该更新 ______ = mid + 1。5.当 a[mid] > target 时,应该更新 ______ = mid - 1。6.二分查找的循环条件是 while ______ <= ______。7.100 个数用二分查找,最多比较 ______ 次。二、判断对错(每题 3 分,共 12 分)1.二分查找可以在没有排序的列表上直接使用。( )2.二分查找的 while 条件写成 low < high 会影响结果。( )3.顺序查找不需要数据有序,这是它的优点。( )4.冒泡排序中如果某一轮一次交换都没有发生,说明列表已经有序。( )三、手算模拟题(14 分)对有序列表 a = [10, 20, 30, 40, 50, 60, 70, 80, 90],用二分查找找 70,请补齐每一步。轮次 low high mid a[mid] 与 70 比较后的动作123结论:需要比较 ______ 次找到 70,它在第 ______ 个位置(从 1 数)。四、★ 补全代码(每空 5 分,共 20 分)第 1 题 二分查找。a = [11, 22, 33, 44, 55, 66, 77, 88, 99]target = 77low, high = 0, len(a) - 1ans = -1while low ①______ high:mid = (low + high) // 2if a[mid] == target:ans = midbreakelif a[mid] < target:low = ②______________else:high = ③______________第 2 题 冒泡排序的提前结束优化。n = len(a)for i in range(n - 1):swapped = Falsefor j in range(n - 1 - i):if a[j] > a[j + 1]:a[j], a[j + 1] = a[j + 1], a[j]swapped = Trueif not ④__________:break① ______ ② ______ ③ ______ ④ ______五、★★ 提高题(每题 10 分,共 30 分)第 1 题 效率对比实验生成一个包含 1~1000 的有序列表,分别用顺序查找和二分查找找最后一个数,记录各自的比较次数。请写出程序并填入下表。方 法 比较次数顺序查找二分查找两种方法相差约 ______ 倍。____________________________________________________________________________________________________________________________第 2 题 手写冒泡并观察请完整写出冒泡排序程序,并在程序中加一个计数器,统计对 a = [5, 3, 8, 1, 9] 排序时一共交换了多少次。__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________第 3 题 改错辨析下面这段二分查找为什么可能陷入死循环?请指出原因并改正。while low <= high:mid = (low + high) // 2if a[mid] == target:breakelif a[mid] < target:low = mid # ← 这里有问题else:high = mid - 1原因:______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________六、★★★ 挑战题(每题 12 分,共 24 分)第 1 题 查找与排序综合随机生成 20 个 1~100 的整数(可用列表直接写死),要求:① 用冒泡排序把它们从小到大排好;② 分别用顺序查找和二分查找查找同一个数;③ 打印两种方法各自的比较次数。____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________第 2 题 猜数字游戏升级(结合二分思想)写一个程序:电脑随机想一个 1~100 的数,你用「每次猜中间数」的策略去猜,让程序统计出需要几次才能猜中。把 100 改成 1000、10000 各试一次,记录次数,你发现了什么规律?____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________教师评语:____________________________________________________________________________________________________________________________________21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)21世纪教育网(www.21cnjy.com)/ 让教学更有效 精品试卷 | 信息第12课 课后练习(答案版 · 教师用)班级:____________ 姓名:____________ 得分:__________一、填空(每空 3 分,共 24 分)1.顺序查找最坏情况下要比较 ______ 次(列表有 n 个元素)。2.二分查找的前提条件是:数据必须已经 ______________。3.二分查找中,中间位置的计算式是 mid = ______________。4.当 a[mid] < target 时,应该更新 ______ = mid + 1。5.当 a[mid] > target 时,应该更新 ______ = mid - 1。6.二分查找的循环条件是 while ______ <= ______。7.100 个数用二分查找,最多比较 ______ 次。二、判断对错(每题 3 分,共 12 分)1.二分查找可以在没有排序的列表上直接使用。( )2.二分查找的 while 条件写成 low < high 会影响结果。( )3.顺序查找不需要数据有序,这是它的优点。( )4.冒泡排序中如果某一轮一次交换都没有发生,说明列表已经有序。( )三、手算模拟题(14 分)对有序列表 a = [10, 20, 30, 40, 50, 60, 70, 80, 90],用二分查找找 70,请补齐每一步。轮次 low high mid a[mid] 与 70 比较后的动作123结论:需要比较 ______ 次找到 70,它在第 ______ 个位置(从 1 数)。四、★ 补全代码(每空 5 分,共 20 分)第 1 题 二分查找。a = [11, 22, 33, 44, 55, 66, 77, 88, 99]target = 77low, high = 0, len(a) - 1ans = -1while low ①______ high:mid = (low + high) // 2if a[mid] == target:ans = midbreakelif a[mid] < target:low = ②______________else:high = ③______________第 2 题 冒泡排序的提前结束优化。n = len(a)for i in range(n - 1):swapped = Falsefor j in range(n - 1 - i):if a[j] > a[j + 1]:a[j], a[j + 1] = a[j + 1], a[j]swapped = Trueif not ④__________:break① ______ ② ______ ③ ______ ④ ______五、★★ 提高题(每题 10 分,共 30 分)第 1 题 效率对比实验生成一个包含 1~1000 的有序列表,分别用顺序查找和二分查找找最后一个数,记录各自的比较次数。请写出程序并填入下表。方 法 比较次数顺序查找二分查找两种方法相差约 ______ 倍。____________________________________________________________________________________________________________________________第 2 题 手写冒泡并观察请完整写出冒泡排序程序,并在程序中加一个计数器,统计对 a = [5, 3, 8, 1, 9] 排序时一共交换了多少次。__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________第 3 题 改错辨析下面这段二分查找为什么可能陷入死循环?请指出原因并改正。while low <= high:mid = (low + high) // 2if a[mid] == target:breakelif a[mid] < target:low = mid # ← 这里有问题else:high = mid - 1原因:______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________六、★★★ 挑战题(每题 12 分,共 24 分)第 1 题 查找与排序综合随机生成 20 个 1~100 的整数(可用列表直接写死),要求:① 用冒泡排序把它们从小到大排好;② 分别用顺序查找和二分查找查找同一个数;③ 打印两种方法各自的比较次数。____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________第 2 题 猜数字游戏升级(结合二分思想)写一个程序:电脑随机想一个 1~100 的数,你用「每次猜中间数」的策略去猜,让程序统计出需要几次才能猜中。把 100 改成 1000、10000 各试一次,记录次数,你发现了什么规律?____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________教师评语:____________________________________________________________________________________________________________________________________第 12 课 参考答案(教师用)与《教师参考答案》册同源,全部数值均已实际运行核验一、填空1.n 2.排好序(有序) 3.(low + high) // 2 4.low 5.high6.low、high 7.7二、判断对错1.×(二分查找的前提就是数据有序,乱序会找不到明明存在的数) 2.√ 3.√ 4.√三、手算模拟题在 [10, 20, 30, 40, 50, 60, 70, 80, 90] 中查找 70:轮次 low high mid a[mid] 动作1 0 8 4 50 50 < 70 → low = 52 5 8 6 70 找到了!结论:需要比较 2 次,70 在第 7 个位置。四、★ 补全代码① <= ② mid + 1 ③ mid - 1 ④ swapped五、★★ 提高题第 1 题:def seq_steps(a, t):c = 0for x in a:c += 1if x == t:breakreturn cdef bin_steps(a, t):low, high, c = 0, len(a) - 1, 0while low <= high:c += 1mid = (low + high) // 2if a[mid] == t:breakelif a[mid] < t:low = mid + 1else:high = mid - 1return ca = list(range(1, 1001))t = 1000print("顺序查找:", seq_steps(a, t), "次") # 1000 次print("二分查找:", bin_steps(a, t), "次") # 10 次顺序查找 1000 次,二分查找 10 次,相差约 100 倍。第 2 题:在冒泡排序内层交换处加计数器:a = [5, 3, 8, 1, 9]n = len(a)cnt = 0for i in range(n - 1):for j in range(n - 1 - i):if a[j] > a[j + 1]:a[j], a[j + 1] = a[j + 1], a[j]cnt += 1print(a)print("共交换", cnt, "次") # 4 次第 3 题:low = mid 是错误的。因为 a[mid] 已经确定不等于目标,如果不 +1,low 可能一直停在原处不动,导致 mid 反复取同一个值,程序陷入死循环。应改为 low = mid + 1。六、★★★ 挑战题第 1 题:a = [45, 12, 78, 34, 56, 89, 23, 67, 90, 11,5, 42, 88, 29, 73, 61, 17, 95, 38, 51]n = len(a)for i in range(n - 1):for j in range(n - 1 - i):if a[j] > a[j + 1]:a[j], a[j + 1] = a[j + 1], a[j]print("排序后:", a)t = 45# 顺序查找c1 = 0for x in a:c1 += 1if x == t:break# 二分查找low, high, c2 = 0, n - 1, 0while low <= high:c2 += 1mid = (low + high) // 2if a[mid] == t:breakelif a[mid] < t:low = mid + 1else:high = mid - 1print("顺序查找比较", c1, "次;二分查找比较", c2, "次")第 2 题参考思路:每次猜范围中间的数,100 个数最多 7 次;1000 个数最多 10 次;10000 个数最多 14 次。规律:每扩大 10 倍,只需多猜约 3~4 次(因为 2 = 1024)。这就是二分查找「对数级」的效率。21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)21世纪教育网(www.21cnjy.com) 展开更多...... 收起↑ 资源列表 第12课 查找与排序——让数据排好队,找得更快课后练习(学生用).docx 第十二课课后练习(答案版).docx