From 75cba05f491c52fe044f3c966cd0a7d7a20bb9bd Mon Sep 17 00:00:00 2001 From: Huangzj Date: Fri, 5 Feb 2021 14:47:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(Go-Tool)=EF=BC=9A2021/2/5:=20=20=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=8C=E5=88=86=E6=9F=A5=E6=89=BE=E5=8C=BA?= =?UTF-8?q?=E9=97=B4=E5=86=85=E6=95=B0=E5=80=BC=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 + util/search/BinarySearch.go | 24 ++++++++++++ util/search/BinarySearch_test.go | 63 ++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) diff --git a/readme.md b/readme.md index bc827ac..3d5fb38 100644 --- a/readme.md +++ b/readme.md @@ -68,6 +68,8 @@ 2020/12/31:新增项目案例(角色技能树) +2021/2/5: 新增二分查找区间内数值方法 + # 修复日志 2020/11/23:修改项目案例(按照一定规则对一组数据进行排序分组) diff --git a/util/search/BinarySearch.go b/util/search/BinarySearch.go index 1cd1d49..3c9956b 100644 --- a/util/search/BinarySearch.go +++ b/util/search/BinarySearch.go @@ -26,3 +26,27 @@ func BinarySearch(list []int, value int) int { return -1 } + +//二分查找在两个数值之间的数据 +func BinarySearchBetween(list []int, value int) int { + low := 0 + high := len(list) - 1 + var mid int + + for low <= high { + //求mid + mid = (low + high) >> 1 + //要算后面一个元素,所以下标要判断是否超过 并且需要考虑超过数组最大值的情况 + if (mid+1 < len(list) && value > list[mid] && value < list[mid+1]) || value == list[mid] || (mid+1 >= len(list) && value > list[mid]) { + return mid + } + //位移 + if value < list[mid] { + high = mid - 1 + } else { + low = mid + 1 + } + } + //未找到元素 + return -1 +} diff --git a/util/search/BinarySearch_test.go b/util/search/BinarySearch_test.go index f4debed..8bf43cb 100644 --- a/util/search/BinarySearch_test.go +++ b/util/search/BinarySearch_test.go @@ -40,3 +40,66 @@ func TestBinarySearch(t *testing.T) { position = BinarySearch(oddNumList, -10) fmt.Println(position) } + +func TestBinarySearchBetween(t *testing.T) { + + evenNumList := []int{1, 2, 3, 5, 6, 7, 9, 10, 22, 111, 333, 431} + + for _, r := range evenNumList { + position := BinarySearchBetween(evenNumList, r) + fmt.Println(position) + } + + position := BinarySearchBetween(evenNumList, 999) + fmt.Println(position) + + position = BinarySearchBetween(evenNumList, -10) + fmt.Println(position) + + position = BinarySearchBetween(evenNumList, 1) + fmt.Println(position) + + position = BinarySearchBetween(evenNumList, 3211) + fmt.Println(position) + + position = BinarySearchBetween(evenNumList, 334) + fmt.Println(position) + + position = BinarySearchBetween(evenNumList, 110) + fmt.Println(position) + + position = BinarySearchBetween(evenNumList, 3222) + fmt.Println(position) + + fmt.Println() + + oddNumList := []int{1, 2, 3, 5, 6, 7, 9, 10, 22, 111, 333, 431, 3211} + for _, r := range oddNumList { + position := BinarySearchBetween(oddNumList, r) + fmt.Println(position) + } + + fmt.Println("测试between") + fmt.Println() + + position = BinarySearchBetween(oddNumList, 999) + fmt.Println(position) + + position = BinarySearchBetween(oddNumList, -10) + fmt.Println(position) + + position = BinarySearchBetween(oddNumList, 1) + fmt.Println(position) + + position = BinarySearchBetween(oddNumList, 3211) + fmt.Println(position) + + position = BinarySearchBetween(oddNumList, 334) + fmt.Println(position) + + position = BinarySearchBetween(oddNumList, 110) + fmt.Println(position) + + position = BinarySearchBetween(oddNumList, 3222) + fmt.Println(position) +}