您好,登錄后才能下訂單哦!
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲(chǔ)結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列
查找過(guò)程:
首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個(gè)子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子表,否則進(jìn)一步查找后一子表。重復(fù)以上過(guò)程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時(shí)查找不成功。
算法要求:
1.必須采用順序存儲(chǔ)結(jié)構(gòu)。
2.必須按關(guān)鍵字大小有序排列。
要求:
請(qǐng)對(duì)一個(gè)有序數(shù)組進(jìn)行二分查找 {1,8, 10, 89, 1000, 1234} ,輸入一個(gè)數(shù)看看該數(shù)組是否存 在此數(shù),并且求出下標(biāo),如果沒(méi)有就 示"沒(méi)有這個(gè)數(shù)"。【會(huì)使用到遞歸】
/二分查找的函數(shù)
/*
二分查找的思路: 比如我們要查找的數(shù)是 findVal
1. arr 是一個(gè)有序數(shù)組,并且是從小到大排序
2. 先找到 中間的下標(biāo) middle = (leftIndex + rightIndex) / 2, 然后讓 中間下標(biāo)的值和 findVal 進(jìn)行
比較
2.1 如果 arr[middle] > findVal , 就應(yīng)該向 leftIndex ---- (middle - 1)
2.2 如果 arr[middle] < findVal , 就應(yīng)該向 middel+1---- rightIndex
2.3 如果 arr[middle] == findVal , 就找到
2.4 上面的 2.1 2.2 2.3 的邏輯會(huì)遞歸執(zhí)行
3. 想一下,怎么樣的情況下,就說(shuō)明找不到[分析出退出遞歸的條件!!] if leftIndex > rightIndex {
// 找不到..
return .. }
*/
package main import "fmt" func BinarySearch(arr *[6]int,leftIndex int,rightIndex int ,findVal int ){ if leftIndex > rightIndex{ fmt.Printf("%v中找不到\t元素%v\n",(*arr),findVal) return } //先找到中間下標(biāo) midddle := (leftIndex+rightIndex)/2 if (*arr)[midddle] >findVal { //說(shuō)明要查找的數(shù)在左邊 就應(yīng)該向 leftIndex ---- (middle - 1)再次查找 BinarySearch(arr,leftIndex,midddle-1,findVal) }else if (*arr)[midddle] < findVal{ //如果 arr[middle] < findVal , 就應(yīng)該向 middel+1---- rightIndex BinarySearch(arr,midddle+1,rightIndex,findVal) }else { //找到了 fmt.Printf("%v中找到元素%v,下標(biāo)為%v\n",(*arr),findVal,midddle) } } func main() { ArraryNum := [6]int{1,8, 10, 89, 1000, 1234} ArraryNum2 := [6]int{8,200, 300, 889, 1000, 1234} BinarySearch(&ArraryNum,0,len(ArraryNum),1234) BinarySearch(&ArraryNum2,0,len(ArraryNum),300) BinarySearch(&ArraryNum,0,len(ArraryNum),-8) BinarySearch(&ArraryNum2,0,len(ArraryNum),30) } //結(jié)果
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。