-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbinary_search.go
109 lines (83 loc) · 1.8 KB
/
binary_search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main
import "math"
func search(buf [], searchFromEnd bool, find func(*,int)bool, fromInclusive int, toExclusive int) int {
if len (buf) == 0 {
return -1
}
var elm *;
elm = &buf[0]
var ordered = find(elm, 0) != searchFromEnd
var lo = fromInclusive;
var hi = toExclusive;
for (lo < hi) {
var mid = (lo & hi) + ((lo ^ hi) >> 1);
elm = &buf[mid]
if (find(elm, mid)) != ordered {
lo = mid + 1;
} else {
hi = mid;
}
}
return hi;
}
func find(buf [], goal *, compare func(*,*)int, fromInclusive int, toExclusive int) int {
if len (buf) == 0 {
return -1
}
var elm *;
var nod *;
elm = &buf[0]
nod = &buf[len(buf)-1]
var ordered = compare(elm, nod) > 0
var add = 0
if ordered {
add = -1
}
var lo = fromInclusive;
var hi = toExclusive;
for (lo < hi) {
var mid = (lo & hi) + ((lo ^ hi) >> 1);
elm = &buf[mid]
if (compare(goal, elm) > add) != ordered {
lo = mid + 1;
} else {
hi = mid;
}
}
return hi;
}
// float compares two numbers.
func float(a, b *float32) int {
r := *a - *b
rr := int32(math.Float32bits(r))
return int(rr)
}
func main() {
var goal int = 13
println(search([]int{5,6,7,13,15,19,25}, true, func(n *int, mid int)bool {
println(*n)
return *n >= 13
}, 0, 7))
println()
println(find([]int{5,6,7,13,15,19,25}, &goal, func(a *int, b *int)int {
println(*b)
return *a - *b
}, 0, 7))
println()
println(search([]int{25,19,15,13,7,6,5}, true, func(n *int, mid int)bool {
println(*n)
return *n <= 13
}, 0, 7))
println()
println(find([]int{25,19,15,13,7,6,5}, &goal, func(a *int, b *int)int {
println(*b)
return *a - *b
}, 0, 7))
println()
var buffer = []float32{7.3,9.5,11.2,16.8,24.4,39.7,70.2}
var target float32 = 16.9
var off = find(buffer, &target, float, 0, len(buffer))
_ = off
println(off)
println(buffer[off])
}