mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
优化二分查找算法,补充注释
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
package algorithms
|
package algorithms
|
||||||
|
|
||||||
|
|
||||||
type NumberType interface {
|
type NumberType interface {
|
||||||
int | int8 | int16 | int32 | int64 | string | float32 | float64 | uint | uint8 | uint16 | uint32 | uint64
|
int | int8 | int16 | int32 | int64 | string | float32 | float64 | uint | uint8 | uint16 | uint32 | uint64
|
||||||
}
|
}
|
||||||
@@ -9,7 +8,15 @@ type Element[ValueType NumberType] interface {
|
|||||||
GetValue() ValueType
|
GetValue() ValueType
|
||||||
}
|
}
|
||||||
|
|
||||||
//BiSearch 二分查找,切片必需有序号。matchUp表示是否向上范围查找。比如:数列10 20 30 ,当value传入25时,返回结果是2,表示落到3的范围
|
/*
|
||||||
|
BiSearch 二分查找,切片必需有序
|
||||||
|
matchUp规则如下:
|
||||||
|
参数为0时,则一定要找到相等的值
|
||||||
|
参数-1时,找value左边的值,例如:[10,20,30,40],当value为9时返回-1; 当value为11时,返回0 当value为41时,返回 3
|
||||||
|
参数 1时,找value右边的值,例如:[10,20,30,40],当value为9时返回 0; 当value为11时,返回1 当value为41时,返回-1
|
||||||
|
|
||||||
|
返回-1时代表没有找到下标
|
||||||
|
*/
|
||||||
func BiSearch[ValueType NumberType, T Element[ValueType]](sElement []T, value ValueType, matchUp int) int {
|
func BiSearch[ValueType NumberType, T Element[ValueType]](sElement []T, value ValueType, matchUp int) int {
|
||||||
low, high := 0, len(sElement)-1
|
low, high := 0, len(sElement)-1
|
||||||
if high == -1 {
|
if high == -1 {
|
||||||
@@ -30,24 +37,26 @@ func BiSearch[ValueType NumberType, T Element[ValueType]](sElement []T, value Va
|
|||||||
|
|
||||||
switch matchUp {
|
switch matchUp {
|
||||||
case 1:
|
case 1:
|
||||||
if (sElement[mid].GetValue()) < value &&
|
if (sElement[mid].GetValue()) < value {
|
||||||
(mid+1 < len(sElement)-1) {
|
if mid+1 >= len(sElement) {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
return mid + 1
|
return mid + 1
|
||||||
}
|
}
|
||||||
return mid
|
return mid
|
||||||
case -1:
|
case -1:
|
||||||
if (sElement[mid].GetValue()) > value {
|
if (sElement[mid].GetValue()) > value {
|
||||||
if mid - 1 < 0 {
|
if mid-1 < 0 {
|
||||||
return -1
|
return -1
|
||||||
} else {
|
} else {
|
||||||
return mid - 1
|
return mid - 1
|
||||||
}
|
}
|
||||||
} else if (sElement[mid].GetValue()) < value {
|
} else if (sElement[mid].GetValue()) < value {
|
||||||
if (mid+1 < len(sElement)-1) {
|
//if mid+1 < len(sElement)-1 {
|
||||||
return mid + 1
|
// return mid + 1
|
||||||
} else {
|
//} else {
|
||||||
return mid
|
return mid
|
||||||
}
|
//}
|
||||||
} else {
|
} else {
|
||||||
return mid
|
return mid
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user