資源簡介 (共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算法思想關鍵點在于查找范圍的不斷縮小, 效率比較高,但要按查找關鍵字先排序◆找到不退出◆二分查找課堂小結 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫