对于Golang中,如果采用二分查找,那么数组的int元素必须是有序的。
练习题:随机生成10个整数(1-100之间),使用冒泡排序法进行排序,然后使用二分查找法,查找是否有87 这个数,并输出显示下标。如果没有则提示“找不到该数”
package main
import (
"fmt"
"math/rand"
"time"
)
//只能是指针方法的传递
func SortArr(numArr *[10]int) [10]int{
tmp := 0 //过桥变量
var arrInt [10]int
for i := 0; i < len(*numArr) - 1; i ++ {
for j := 0; j < len(*numArr) - 1 - i; j++ {
if (*numArr)[j] > (*numArr)[j + 1] { //正排序
tmp = (*numArr)[j]
(*numArr)[j] = (*numArr)[j + 1]
(*numArr)[j + 1] = tmp
}
}
arrInt = *numArr
}
return arrInt
}
//利用二分查找数组中是否存在87
func FindNum(arrInt *[10]int,leftPtr int,rightPtr int,findNum int) {
if leftPtr > rightPtr {
fmt.Printf("没有找到%v... \n",findNum)
return
}
//先求出中间的指针位置
mPtr := (leftPtr + rightPtr) / 2
if (*arrInt)[mPtr] > findNum {
//递归调用,从mPtr ---> leftPtr之间查找
FindNum(arrInt,leftPtr,mPtr - 1,findNum)
} else if ((*arrInt)[mPtr]) < findNum {
//递归调用,从leftPtr + 1 ----> rightPtr之间查找
FindNum(arrInt,mPtr + 1,rightPtr,findNum)
} else {
//当leftPtr == rightPtr,则找到该数值
fmt.Printf("找到该数%v,下标位置为%v \n",findNum,mPtr)
}
}
func main() {
var numArr [10]int
for i := 0; i < len(numArr); i ++ {
//设置一个时间种子,避免每次刷新都是同一组数
rand.Seed(time.Now().UnixNano())
n := rand.Intn(100) + 1 // 1 ~ 100
numArr[i] = n
}
fmt.Println("排序前 = ",numArr)
arrInt := SortArr(&numArr)
fmt.Println("排序后 = ",arrInt)
FindNum(&numArr,0,(len(numArr) - 1),87)
}
输出结果: