优化二分查找算法,补充注释

This commit is contained in:
orgin
2022-11-11 14:17:29 +08:00
parent 2101c8903c
commit a32ff59676

View File

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