• Golang查找-顺序查找-二分法查找方法思路详解


    package main
    
    import (
    	"fmt"
    )
    
    //顺序查找就是在一个序列中一个一个数进行对比指导找到查找的值
    //顺序查找方法一
    func Orderfindvalue(arrslice []int, findvalue int) {
    	for i := 0; i < len(arrslice); i++ {
    		if findvalue == arrslice[i] {
    			fmt.Printf("找到了,下标是%v
    ", 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
    ", index)
    	} else {
    		fmt.Printf("没有找到")
    	}
    }
    
    //二分法查找 思路分析变成代码
    //注意事项,二分法查找必须是在有序序列中查找
    /*
    二分法查找的思路:比如我们要查找的数是 findvalue (变量名)  // 声明变量 findvalue=8
    1. 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 = 0
    
    func BinaryFind(arrslice []int, leftindex int, rigthindex int, findvalue int) {
    
    	if leftindex > rigthindex {
    		fmt.Printf("没有找到
    ")
    		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
    ", 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
    ", count)
    }
    
    
  • 相关阅读:
    SpringBoot自动装配源码
    对称加密、非对称加密、数字签名
    k8s部署mysql数据持久化
    docker部署 springboot 多模块项目+vue
    ES入门及安装软件
    prometheus入门介绍及相关组件、原理讲解
    流水线 Sonar 代码扫描
    postgresql数据库 查询表名、备注及字段、长度、是否可控、是否主键等信息
    Helm中Tiller镜像下载失败的解决办法
    程序员孔乙己
  • 原文地址:https://www.cnblogs.com/egrep/p/10696583.html
Copyright © 2020-2023  润新知