package main
import"fmt"funcmain(){// 有一個數(shù)列:白眉鷹王、金毛獅王、紫衫龍王、青翼蝠王//猜數(shù)游戲:從鍵盤中任意輸入一個名稱,判斷數(shù)列中是香包含此名稱【順序查找】//思路//1.定義一個數(shù)組,白眉鷹王、金毛獅王、紫衫龍王、青翼蝠王字符串?dāng)?shù)組//2.從控制臺接收一個名字,依次比較,如果發(fā)現(xiàn)有,提示// 代碼names :=[4]string{"白眉鷹王","金毛獅王","紫衫龍王","青翼蝠王"}var heroName =""fmt.Println("請輸入要查找的人名..")fmt.Scanln(&heroName)// 順序查找:第一種方式for i :=0; i <len(names); i++{if heroName == names[i]{fmt.Printf("找到%v,下標(biāo)%v\n",heroName,i)break}elseif i ==(len(names)-1){fmt.Printf("沒有找到%v\n",heroName)}}// 順序查找:第二種方式(推薦)index :=-1for i :=0; i <len(names); i++{if heroName == names[i]{index = ibreak}}if index ==-1{fmt.Printf("沒找到%v\n",heroName)}else{fmt.Printf("找到%v,下標(biāo)%v\n",heroName,index)}}
2. 二分查找(該數(shù)組是有序的)
舉個栗子 請對一個有序數(shù)組進行二分查找{1,8,10,89,1000,1234},輸入一個數(shù)看看該數(shù)組是否存在此數(shù),并且求出下標(biāo),如果沒有就提示"沒有這個數(shù)"。【會使用到遞歸】 二分查找的思路分析 arr = [1,8,10,89,1000,1234] 8 二分查找的思路:比如要查找的數(shù)是key 1).arr是一個有序數(shù)組,并且是從小到大排序 2).先找到中間的下標(biāo)mid=(leftl+right)/2,然后讓中間下標(biāo)的值和key進行比較 (1)如果arr[mid] >key,就應(yīng)該向left ----(mid-1) (2)如果arr[mid]<key,就應(yīng)該向mid+1---- right (3)如果arr[mid] == key,就找到 (4)上面的1).2).3)的邏輯會遞歸執(zhí)行 3)分析退出遞歸的條件 if left > right{ return… } 二分查找的代碼實現(xiàn)
package main
import"fmt"//二分查找的函數(shù)/*
arr = [1,8,10,89,1000,1234] 8
二分查找的思路:比如要查找的數(shù)是key
1.arr是一個有序數(shù)組,并且是從小到大排序
2.先找到中間的下標(biāo)mid=(leftl+right)/2,然后讓中間下標(biāo)的值和key進行比較
1)如果arr[mid] >key,就應(yīng)該向left ----(mid-1)
2)如果arr[mid]<key,就應(yīng)該向mid+1---- right
3)如果arr[mid] == key,就找到
4) 上面的1).2).3)的邏輯會遞歸執(zhí)行
3.分析退出遞歸的條件
if left > right{return..
}
*/funcBinaryFind(arr *[6]int, left int, right int, key int){// 判斷是否left>rightif left > right{fmt.Println("沒找到")return}// 先找到 中間的下標(biāo)mid :=(left + right)/2if key >(*arr)[mid]{// 說明要查找的數(shù)在mid+1 --- rightBinaryFind(arr, mid+1, right, key)}elseif key <(*arr)[mid]{// 說明要查找的數(shù)在left --- mid-1BinaryFind(arr, left, mid-1, key)}else{// 找到了fmt.Printf("找到了,下標(biāo)為%v\n",mid)}}funcmain(){arr :=[6]int{1,8,10,89,1000,1234}// 測試一下BinaryFind(&arr,0,len(arr)-1,8)}