Go语言二分之查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
查找过程:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法要求:
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
要求:
请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就 示"没有这个数"。【会使用到递归】
/二分查找的函数
/*
二分查找的思路: 比如我们要查找的数是 findVal
1. arr 是一个有序数组,并且是从小到大排序
2. 先找到 中间的下标 middle = (leftIndex + rightIndex) / 2, 然后让 中间下标的值和 findVal 进行
比较
2.1 如果 arr[middle] > findVal , 就应该向 leftIndex ---- (middle - 1)
2.2 如果 arr[middle] < findVal , 就应该向 middel+1---- rightIndex
2.3 如果 arr[middle] == findVal , 就找到
2.4 上面的 2.1 2.2 2.3 的逻辑会递归执行
3. 想一下,怎么样的情况下,就说明找不到[分析出退出递归的条件!!]if leftIndex > rightIndex {
// 找不到..
return ..}
*/
packagemainimport"fmt"funcBinarySearch(arr*[6]int,leftIndexint,rightIndexint,findValint){ifleftIndex>rightIndex{fmt.Printf("%v中找不到\t元素%v\n",(*arr),findVal)return}//先找到中间下标midddle:=(leftIndex+rightIndex)/2if(*arr)[midddle]>findVal{//说明要查找的数在左边就应该向leftIndex----(middle-1)再次查找BinarySearch(arr,leftIndex,midddle-1,findVal)}elseif(*arr)[midddle]<findVal{//如果arr[middle]<findVal,就应该向middel+1----rightIndexBinarySearch(arr,midddle+1,rightIndex,findVal)}else{//找到了fmt.Printf("%v中找到元素%v,下标为%v\n",(*arr),findVal,midddle)}}funcmain(){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)}//结果
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。