资源简介 (共34张PPT)5.4.2 查找算法的应用1.老师请身高在165到170的同学排练舞蹈2.到超市购买水笔3.乘公交车刷卡付钱查找算法 基本算法 操作基础生活实例VIP号 姓名 飞行里程(km)积分600214 韩江辉 16801519601278 蒋志来 532178600815 李亚东 28745436…… …… …………603692 赵新星 532178600087 蔡佳宁 112703958不少航空公司都会提供优惠的会员服务,当某会员飞行里程累积达到一定数量 后,可以使用里程积分兑换奖励机票或奖励升舱等服务。现给定某航空公司VIP会 员的飞行里程、积分等信息,如下表所示,要求实现根据VIP号码快速查询会员积实例分析 航空公司VIP会员积分查询分的功能。1.抽象与建模记录 查找1.按列存储 四个一维数组vip xm lc jf2.数据结构jf[2]xmvip[2][2][2]lc2.按行存储 一个一维数组 aa[i]a[2][0] a[2][1] a[2][2] a[2][3]2.数据结构顺序查找 查找效率低二分查找 → 查找效率高数据按VIP号有序3.设计算法查找算法import csvcsvFile=open(" csv","r") reader=csv.reader(csvFile)a=[]for item in reader:_____csvFile__按行存储的一维数组a 二分查找算法"vip.csv"1 读入数据类型:字符串4.编写程序a.append(item)vip.a[1]a[0]2 按VIP号排序#冒泡排序def bubble_sort(d):for i in range(1,len(d)):for j in range(1,len(d)-i):d[j], d[j+1]=d[j+1],d[j]int(d[j][0])>int(d[j+1][0]):4.编写程序ifj=m-1else:i=m+1return -1 #未找到返回-1if int(array[m][0])==s:return mif sj=len(array)-1 while i<=j:m=(i+j)//23 按VIP号查找#二分查找):bsearch(s,array4.编写程序i=1defkey=int(input(‘请输入要查询的VIP号: ’)) m=bsearch(key,a)if m!=-1:print(a[m][1],"先生/女士, 您的积分为:",a[m][3]) else:print("找不到VIP号对应的用户信息!")解决问题的关键在于分析问题设计算法#读入数据存入数组a中 #代码见P9def bubble_sort(d):#代码见P10def bsearch(s,array):#代码见P11bubble_sort(a)_______________4 调用输出4.编写程序VIP号 姓名 飞行里程(km)积分600214 韩江辉 16801519601278 蒋志来 532178600815 李亚东 28745436…… …… …………603692 赵新星 532178600087 蔡佳宁 112703958实例拓展 航空公司积分升级服 务航空公司根据会员的积分推出升级服务,现要对积分在[500,800]的会员进行升级,请编程找 出积分在此范围的所有会员。查找积分在[500,800]的会员二分查找排序关键字: 积分设计算法排序1.要进行几次二分查找? 两次二 分查找2.500(800)在积分中一定存在吗? 可能不存在 >500i m j200370 430 560 585 610 790 820 932 9680 1 2 3 4 5 6 7 8 9查找积分在[500,800]的会员设计算法200370 430 560 585 610 790 820 932 968 i m j200370 430 560 585 610 790 820 932 9680 1 2 3 4 5 6 7 8 91.要进行几次二分查找? 两次二 分查找2.500(800)在积分中一定存在吗? 可能不存在 >500j im查找积分在[500,800]的会员0 1 2 3 4 5 6 7 8 9设计算法1.要进行几次二分查找? 两次二 分查找2.500(800)在积分中一定存在吗? 可能不存在 >500j i200370 430 585 790 820 932 9680 1 2 3 4 5 6 7 8 9200370 430 585 790 820 932 9680 1 2 3 4 5 6 7 8 9j i560查找积分在[500,800]的会员设计算法610610560m1.要进行几次二分查找? 两次二 分查找2.500(800)在积分中一定存在吗? 可能不存在 >5003.500(800)的积分会不会存在多个? 可能存在 找最左500和最右800 i m j200470 500 500 500 500 500 650 730 9680 1 2 3 4 5 6 7 8 9查找积分在[500,800]的会员设计算法1.要进行几次二分查找? 两次二分查找2.500(800)在积分中一定存在吗? 可能不存在 >500200470 630 760 800 800 800 800 800 9680 1 2 3 4 5 6 7 8 9j im可能存在 找最左500和最右8003.500(800)的积分会不会存在多个?200470 500 500 500 500 500 650 730 968查找积分在[500,800]的会员0 1 2 3 4 5 6 7 8 9设计算法mij1.要进行几次二分查找? 两次二分查找2.500(800)在积分中一定存在吗? 可能不存在 >5003.500(800)的积分会不会存在多个? 可能存在 找最左500和最右800j i500- oj i200470 630 760 800 800 800 800 800 9680 1 2 3 4 5 6 7 8 9200470 500 500 500 650 730 968查找积分在[500,800]的会员0 1 2 3 4 5 6 7 8 9设计算法500m200470 500 500 500 500 500 650 730 968200370 430 560 585 610 790 820 932 968查找积分在[500,800]的会员j位置数1.积分大于等于500j i设计算法ijj位置数<=keyj i200370 430 560 585 610 790 820 932 968200470 630 760 800 800 800 800 800 968查找积分在[500,800]的会员2.积分小于等于800设计算法ji1 按积分排序#冒泡排序def bubble_sort1(d):for i in range(1,len(d)):for j in range(1,len(d)-i):(d[j+1][0]):int(d[j][0])>intd[j], d[j+1]=d[j+1],d[j]4.编写程序if1 按积分排序#冒泡排序def bubble_sort1(d):for i in range(1,len(d)):for j in range(1,len(d)-i):(d[j+1][3]):int(d[j][3])>intd[j], d[j+1]=d[j+1],d[j]4.编写程序ifdef bsearchz(s,array):i=1j=len(array)-1while i<=j:m=(i+j)//2if int(array[m][0])==s:return mif sj=m-1else:i=m+1return -1200470 500 500 500 500 500 650 730 968j位置数200370 430 560 585 610 790 820 932 9682 按积分相等往左查找j iijdef bsearchz(s,array):i=1j=len(array)-1while i<=j:m=(i+j)//2if sj=m-1else:i=m+1return -1200470 500 500 500 500 500 650 730 968j位置数200370 430 560 585 610 790 820 932 9682 按积分相等往左查找j iijdef bsearchz(s,array):i=1j=len(array)-1while i<=j:m=(i+j)//2if sj=m-1else:i=m+1return -1200470 500 500 500 500 500 650 730 968j位置数200370 430 560 585 610 790 820 932 9682 按积分相等往左查找j iijdef bsearchz(s,array):i=1j=len(array)-1while i<=j:m=(i+j)//2if s<=int(array[m][ 3]):j=m-1else:i=m+1return -1200470 500 500 500 500 500 650 730 968j位置数200370 430 560 585 610 790 820 932 9682 按积分相等往左查找j iijdef bsearchz(s,array):i=1j=len(array)-1while i<=j:m=(i+j)//2if s<=int(array[m][ 3]):j=m-1else:i=m+1return i200470 500 500 500 500 500 650 730 968j位置数200370 430 560 585 610 790 820 932 9682 按积分相等往左查找j iijdef bsearchz(s,array):i=1j=len(array)-1while i<=j:m=(i+j)//2if s<=int(array[m][3]):j=m-1else:i=m+1return □i200470 500 500 500 500 500 650 730 968j位置数200370 430 560 585 610 790 820 932 9682 按积分相等往左查找j iijdef bsearchy(s,array): i=1j=len(array)-1while i<=j:m=(i+j)//2if s<=int(array[m][3]):j=m-1else:i=m+1return i200470 630 760 800 800 800 800 800 968j位置数<=key200370 430 560 585 610 790 820 932 9683 按积分相等往右查找jjiidef bsearchy(s,array): i=1j=len(array)-1while i<=j:m=(i+j)//2if sj=m-1else:i=m+1return i200470 630 760 800 800 800 800 800 968j位置数<=key200370 430 560 585 610 790 820 932 9683 按积分相等往右查找jjiidef bsearchy(s,array): i=1j=len(array)-1while i<=j:m=(i+j)//2if sj=m-1else:i=m+1return j200470 630 760 800 800 800 800 800 968j位置数<=key200370 430 560 585 610 790 820 932 9683 按积分相等往右查找jjiibubble_sort1(a) #按积分排序key1=int(input("请输入要查询的积分最小值:") key2=int(input("请输入要查询的积分最大值:")p=bsearchz(key1,a)q=bsearchy(key2,a)print("积分在",key1,"至",key2,"的用户有:")for i in range(p,q+1):print(a[i][1])3 主程序#读入数据存入数组a中 #代码见P9def bubble_sort(d):#代码见P23def bsearchz (s,array):#代码见P25def bsearchz (s,array):#代码见P26 ★迁移改变 归纳功能关键要看清找到后继续往哪边查找找到后继续往左边找 j位置数找到后继续往右边找 j位置数<=key算法思想关键点在于查找范围的不断缩小, 效率比较高,但要按查找关键字先排序◆找到不退出◆二分查找课堂小结 展开更多...... 收起↑ 资源预览