• Golang实现二分查找


    package main
    
    import (
    	"fmt"
    	"math/rand"
    	"time"
    )
    // 二分法判断某个值是否在数组中存在,如果存在则返回所在的位置,不存在则返回-1
    func dichotomy(a []int, value int, position ...int ) int {
    	// 开始匹配值等于0,
    	start := 0
    	// 结束位置要取得数组总长度,既最大下表加1,因为采用向下取整,如果不加1,则永远取不到最后一位
    	end := len(a)
    	if len(position) == 2 {
    		start = position[0]
    		end = position[1]
    	}
    	if end <= start || end < 0 || start < 0{
    		return -1
    	}
    	// 获取中间值,不管总长度是基数还是偶数,都采用向下取整,以免数组越界,
    	// 其中start + (end - start)/2 >= 0 (start => 0,end >= 0, end > start)该式子永远成立
    	median := start + (end - start)/2
    	if a[median] == value {
    		return median
    	}
    	// 当他们相差1的时候说明已经全部匹配完毕
    	if end-start == 1 {
    		return -1
    	}
    	// 执行子二分
    	if value > a[median] {
    		return dichotomy(a, value, median, end)
    	} else {
    		return dichotomy(a, value, start, median)
    	}
    }
    
    func main()  {
    	a := genRand(500, 10)
    	// 输出获取到的数组
    	fmt.Println(a)
    	// 输出数组长度
    	fmt.Println(len(a))
    	// 开始使用二分查找
    	fmt.Println(dichotomy(a, 496))
    	fmt.Println(dichotomy(a, 1))
    }
    // 构建随机数组
    func genRand(max int, carry int) []int {
    	a := make([]int, 0)
    	f := func(n int) int {
    		rand.Seed(time.Now().Unix())
    	angin:
    		i := rand.Intn(n)
    		if i == 0 {
    			goto angin
    		}
    		return i
    	}
    	for i := 1; i < max; i += f(carry) {
    		a = append(a, i)
    	}
    	return a
    }
    

      

  • 相关阅读:
    不同Activity之间传递线程
    面向对象编程笔记--static
    SQL Server Compact/SQLite Toolbox 使用
    VirtualBox 磁盘容量调整
    scala快速入门
    Microsoft.Xna.Framework.TitleContainer.OpenStream()
    Windows Phone 7 中拷贝文件到独立存储
    Windows Phone 7 上传图片
    JavaScript 中undefined,null,NaN的区别
    CentOS7攻克日记(三) —— 安装Python3.6
  • 原文地址:https://www.cnblogs.com/hardykay/p/14504132.html
Copyright © 2020-2023  润新知