/
hyBinarySearch.h
95 lines (79 loc) · 1.98 KB
/
hyBinarySearch.h
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
/* -*- coding: sjis-dos; -*- */
/*
* copyright 2010 FUKUZAWA Tadashi. All rights reserved.
*/
#ifndef m_HYBINARYSEARCH_H_
#define m_HYBINARYSEARCH_H_
template<typename T> bool binarySearch(const T* table, int numContents, const T& val, int* pIndex)
{
int i = 0;
int j = numContents;
int k;
while (i < j) {
k = (i + j) / 2;
const T& v = table[k];
if (v == val){
*pIndex = k;
return true;
}
if (v < val) {
i = k + 1;
} else {
j = k;
}
}
*pIndex = i; // == j
return false;
}
template<typename T> bool binarySearchRange(const T* table, int numContents, const T& val, int* pIndexMin, int* pIndexMax)
{
int i = 0;
int j = numContents;
int k;
while (i < j) {
k = (i + j) / 2;
const T& v = table[k];
if (v == val){
// found
i = k - 1;
while ((i >= 0) && (table[i] == val))
--i;
j = k + 1;
while ((j < numContents) && (table[j] == val))
++j;
*pIndexMin = i + 1;
*pIndexMax = j - 1;
return true;
}
if (v < val) {
i = k + 1;
} else {
j = k;
}
}
*pIndexMin = *pIndexMax = i; // == j
return false;
}
template<typename T, typename U> bool binarySearchFn(T* table, int numContents, int (*fn)(T&, U&), U& val, int* pIndex)
{
int i = 0;
int j = numContents;
int k;
while (i < j) {
k = (i + j) / 2;
T& v = table[k];
int f = fn(v, val);
if (f == 0){
*pIndex = k;
return true;
}
if (f < 0) {
i = k + 1;
} else {
j = k;
}
}
*pIndex = i; // == j
return false;
}
#endif /* m_HYBINARYSEARCH_H_ */