改进garray二分查找方法

This commit is contained in:
john
2018-08-23 17:24:24 +08:00
parent af06349ceb
commit 5c55cd3cb3
5 changed files with 38 additions and 36 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View 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))
}