mirror of
https://gitee.com/johng/gf
synced 2026-07-08 06:35:16 +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
|
||||
|
||||
Reference in New Issue
Block a user