golang实现binarySearch

二分查找法

golang收获

  1. 获取随机数, 先设置一个随机时间 rand.Seed(time.Now()).UnixNano()), 然后执行rand.Intn(2<<16)可以获得随机数;
  2. 递归的实现,针对二分查找过程应该数 (](]的区间,中间一个数<=, 然后是 <

算法执行过程

通过一个数组,对里面的内容进行二分查找,数组的大小有2^16,里面为有序的整数;

arr [2 << 16]int

实现一个二分查找,看看返回是否则返回该值, 两种方法都实现,

  1. 一种是for循环,暴力比较;
  2. 一种是二分查找

暴力查询的时间约为 215.193µs, 二分查找的平均值为 500ns; 两者差了400倍的速度;

package main

import (
	"fmt"
	"math/rand"
	"time"
)

const NUM = 100000

func main() {
	fmt.Println("hello binary search")

	arr := NewArr()

	rand.Seed(time.Now().UnixNano())

	t := time.Now()
	for i := 0; i < NUM; i++ {
		num := rand.Intn(2<<16 - 1)
		// _ = FindV(arr, num)
		_ = FindV2(arr, num, 0, 2<<16-1)

	}
	tt := time.Now().Sub(t) / NUM
	fmt.Println(tt)

}

func FindV(arr *[2 << 16]int, v int) int {

	for i := 0; i < len(arr); i++ {
		if arr[i] == v {
			return i
		}
	}
	return 0
}

func FindV2(arr *[2 << 16]int, v int, l int, h int) int {

	if l > h {
		return -1
	}

	mid := l + (h-l)/2

	if v == arr[mid] {
		return arr[mid]
	} else if v <= arr[mid] {
		FindV2(arr, v, l, arr[mid])
	} else {
		FindV2(arr, v, arr[mid], h)
	}

	return 0
}

// 如何返回一个数组指针
func NewArr() *[2 << 16]int {
	arr := [2 << 16]int{}
	//	return &arr

	for i := 0; i < 2<<16; i++ {
		arr[i] = i
	}
	return &arr
}

posted @ 2018-11-05 21:59  学习成长  阅读(261)  评论(0)    收藏  举报