博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang查找-顺序查找-二分法查找方法思路详解
阅读量:5345 次
发布时间:2019-06-15

本文共 2402 字,大约阅读时间需要 8 分钟。

package mainimport (    "fmt")//顺序查找就是在一个序列中一个一个数进行对比指导找到查找的值//顺序查找方法一func Orderfindvalue(arrslice []int, findvalue int) {    for i := 0; i < len(arrslice); i++ {        if findvalue == arrslice[i] {            fmt.Printf("找到了,下标是%v\n", i)            //找到以后我们结束循环            break        } else if i == len(arrslice)-1 { //这里为什么用下标和最后一个数进行比较,就是当查找到最后一个数 如果也没有找到就返回没有找到            fmt.Printf("没有找到")        }    }}//顺序查找方法二func Orderfindvalue1(arrslice []int, findvalue int) {    //首先我们定义一个index变量 代表索引下标    //如果index 是-1 就是没有找到,这样的话,逻辑会跟清楚,相当一个标志位,代码的可读性也提高了不少    index := -1    for i, value := range arrslice {        if value == findvalue {            index = i            break        }    }    //来判断有没有找到    if index != -1 {        fmt.Printf("找到了,下标是%v\n", index)    } else {        fmt.Printf("没有找到")    }}//二分法查找 思路分析变成代码//注意事项,二分法查找必须是在有序序列中查找/*二分法查找的思路:比如我们要查找的数是 findvalue (变量名)  // 声明变量 findvalue=81. arrslice 必须是一个有序序列,并且是从小到大排序        // 声明变量 arrslice=[]int{1,3,7,9,10,11,15}2.先找到 中间数组的下标 middle=(leftindex + rightindex)/2 求出我们中间索引的位置,然后让数组中间下标的值和findvalue进行比较,会有以下几种可能2.1 如果arrslice[middle] > findvalue ,就应该向 leftindex---(middle - 1) 中查找2.2 如果arrslice[middle] < findvalue ,就应该向 (middle + 1 ) --- rightindex 中查找2.3 如果  arrslice[middle] == findvalue ,就说明找到了2.4 上面的 2.1 、 2.2 、2.3 的逻辑会递归执行3. 想一下,在上面情况下,就说明找不到( 分析出退出递归的条件 ) 凡是涉及到递归,都要考虑退出递归不然就死归了   if leftindex > rigthindex {       //找不到       return   }*/var count int = 0func BinaryFind(arrslice []int, leftindex int, rigthindex int, findvalue int) {    if leftindex > rigthindex {        fmt.Printf("没有找到\n")        return    }    middle := (leftindex + rigthindex) / 2    //如果中间索引的值大于我们找的值 就应该向 leftindex---(middle - 1) 中查找    if arrslice[middle] > findvalue {        BinaryFind(arrslice, leftindex, (middle - 1), findvalue)        count++    } else if arrslice[middle] < findvalue {        BinaryFind(arrslice, (middle + 1), rigthindex, findvalue)        count++    } else {        fmt.Printf("找到了 下标是%v\n", middle)        count++    }}func main() {    //无序序列 也就是一个切片或者数组(切片底层实际上也是数组)    // arrslice := []int{1, 7, 2, 8, 9, 3}    //顺序查找方法一    // Orderfindvalue(arrslice, 9)    //顺序查找方法二 (推荐方法)    // Orderfindvalue1(arrslice, 10)    //二分法查找         //申明有序序列    arrslice := []int{1, 3, 7, 9, 10, 11, 15}    BinaryFind(arrslice, 0, len(arrslice)-1, 9)    fmt.Printf("count:%v\n", count)}

转载于:https://www.cnblogs.com/egrep/p/10696583.html

你可能感兴趣的文章
OpenCV的配置
查看>>
spring Cache + Redis 开发数据字典以及自定义标签
查看>>
成功连上数据库顿感世界美好许多
查看>>
编程注意2
查看>>
《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
查看>>
javascript中sort()排序方法总结
查看>>
实现聊天界面的代码
查看>>
自己生成一个NDK的浅析
查看>>
Excel数据导入到数据库
查看>>
jQuery最佳实践
查看>>
SELinux FAQ
查看>>
Java中synchronized同步的理解
查看>>
python 数值计算库
查看>>
java 服务重启 js 中被注释代码仍然执行
查看>>
我并不是不闻不问![C#]
查看>>
web前端经典小题
查看>>
AutoCAD如何倒角 倒圆角 倒直角
查看>>
Office PPT中如何插入flash
查看>>
C# Fade Form Effect With the AnimateWindow API Function
查看>>
golang多维数组的切片
查看>>