mirror of
https://gitee.com/johng/gf
synced 2026-06-25 01:05:41 +08:00
改进garray二分查找方法
This commit is contained in:
@ -99,6 +99,7 @@ func (a *SortedIntArray) Slice() []int {
|
||||
}
|
||||
|
||||
// 查找指定数值的索引位置,返回索引位置(具体匹配位置或者最后对比位置)及查找结果
|
||||
// 返回值: 最后比较位置, 比较结果
|
||||
func (a *SortedIntArray) Search(value int) (int, int) {
|
||||
if len(a.array) == 0 {
|
||||
return -1, -2
|
||||
@ -109,21 +110,16 @@ func (a *SortedIntArray) Search(value int) (int, int) {
|
||||
mid := 0
|
||||
cmp := -2
|
||||
for {
|
||||
mid = int((min + max) / 2)
|
||||
cmp = a.compareFunc(value, a.array[mid])
|
||||
switch cmp {
|
||||
case -1 : max = mid - 1
|
||||
case 0 :
|
||||
case 1 : min = mid + 1
|
||||
}
|
||||
if cmp == 0 || min > max {
|
||||
break
|
||||
}
|
||||
for {
|
||||
mid = int((min + max) / 2)
|
||||
cmp = a.compareFunc(value, a.array[mid])
|
||||
switch cmp {
|
||||
case -1 : max = mid - 1
|
||||
case 0 :
|
||||
case 1 : min = mid + 1
|
||||
}
|
||||
if cmp == 0 || min > max {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
a.mu.RUnlock()
|
||||
return mid, cmp
|
||||
|
||||
@ -84,6 +84,7 @@ func (a *SortedArray) Slice() []interface{} {
|
||||
}
|
||||
|
||||
// 查找指定数值的索引位置,返回索引位置(具体匹配位置或者最后对比位置)及查找结果
|
||||
// 返回值: 最后比较位置, 比较结果
|
||||
func (a *SortedArray) Search(value interface{}) (int, int) {
|
||||
if len(a.array) == 0 {
|
||||
return -1, -2
|
||||
@ -94,21 +95,16 @@ func (a *SortedArray) Search(value interface{}) (int, int) {
|
||||
mid := 0
|
||||
cmp := -2
|
||||
for {
|
||||
mid = int((min + max) / 2)
|
||||
cmp = a.compareFunc(value, a.array[mid])
|
||||
switch cmp {
|
||||
case -1 : max = mid - 1
|
||||
case 0 :
|
||||
case 1 : min = mid + 1
|
||||
}
|
||||
if cmp == 0 || min > max {
|
||||
break
|
||||
}
|
||||
for {
|
||||
mid = int((min + max) / 2)
|
||||
cmp = a.compareFunc(value, a.array[mid])
|
||||
switch cmp {
|
||||
case -1 : max = mid - 1
|
||||
case 0 :
|
||||
case 1 : min = mid + 1
|
||||
}
|
||||
if cmp == 0 || min > max {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
a.mu.RUnlock()
|
||||
return mid, cmp
|
||||
|
||||
@ -94,6 +94,7 @@ func (a *SortedStringArray) Slice() []string {
|
||||
}
|
||||
|
||||
// 查找指定数值的索引位置,返回索引位置(具体匹配位置或者最后对比位置)及查找结果
|
||||
// 返回值: 最后比较位置, 比较结果
|
||||
func (a *SortedStringArray) Search(value string) (int, int) {
|
||||
if len(a.array) == 0 {
|
||||
return -1, -2
|
||||
@ -104,21 +105,16 @@ func (a *SortedStringArray) Search(value string) (int, int) {
|
||||
mid := 0
|
||||
cmp := -2
|
||||
for {
|
||||
mid = int((min + max) / 2)
|
||||
cmp = a.compareFunc(value, a.array[mid])
|
||||
switch cmp {
|
||||
case -1 : max = mid - 1
|
||||
case 0 :
|
||||
case 1 : min = mid + 1
|
||||
}
|
||||
if cmp == 0 || min > max {
|
||||
break
|
||||
}
|
||||
for {
|
||||
mid = int((min + max) / 2)
|
||||
cmp = a.compareFunc(value, a.array[mid])
|
||||
switch cmp {
|
||||
case -1 : max = mid - 1
|
||||
case 0 :
|
||||
case 1 : min = mid + 1
|
||||
}
|
||||
if cmp == 0 || min > max {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
a.mu.RUnlock()
|
||||
return mid, cmp
|
||||
|
||||
14
geg/container/garray/garray2.go
Normal file
14
geg/container/garray/garray2.go
Normal file
@ -0,0 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gitee.com/johng/gf/g/container/garray"
|
||||
)
|
||||
|
||||
|
||||
func main () {
|
||||
a := garray.NewSortedIntArray(0)
|
||||
a.Add(0)
|
||||
fmt.Println(a.Slice())
|
||||
fmt.Println(a.Search(0))
|
||||
}
|
||||
Reference in New Issue
Block a user