summaryrefslogtreecommitdiffstats
path: root/funtools/bsearch.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 17:38:41 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-27 17:38:41 (GMT)
commit5b44fb0d6530c4ff66a446afb69933aa8ffd014f (patch)
treee059f66d1f612e21fe9d83f9620c8715530353ec /funtools/bsearch.c
parentda2e3d212171bbe64c1af39114fd067308656990 (diff)
parent23c7930d27fe11c4655e1291a07a821dbbaba78d (diff)
downloadblt-5b44fb0d6530c4ff66a446afb69933aa8ffd014f.zip
blt-5b44fb0d6530c4ff66a446afb69933aa8ffd014f.tar.gz
blt-5b44fb0d6530c4ff66a446afb69933aa8ffd014f.tar.bz2
Merge commit '23c7930d27fe11c4655e1291a07a821dbbaba78d' as 'funtools'
Diffstat (limited to 'funtools/bsearch.c')
-rw-r--r--funtools/bsearch.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/funtools/bsearch.c b/funtools/bsearch.c
new file mode 100644
index 0000000..df69ca2
--- /dev/null
+++ b/funtools/bsearch.c
@@ -0,0 +1,68 @@
+/* http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary */
+
+/* returns first target if more than one have same value */
+static public int search(int [] array, int target)
+{
+ int high = array.length, low = -1, probe;
+ while (high - low > 1)
+ {
+ probe = (high + low) / 2;
+ if (array[probe] < target)
+ low = probe;
+ else
+ high = probe;
+ }
+ if (high == array.length || array[high] != target)
+ return -1;
+ else
+ return high;
+}
+
+/* returns last target if more than one have same value */
+static public int search2(int [] array, int target)
+{
+ int high = array.length, low = -1, probe;
+ while (high - low > 1)
+ {
+ probe = (high + low) / 2;
+ if (array[probe] > target)
+ high = probe;
+ else
+ low = probe;
+ }
+ if (low == -1 || array[low] != target)
+ return -1;
+ else
+ return low;
+}
+
+static public int [] range(int [] array, int floor, int ceiling)
+{
+ int [] answer = new int[2];
+ int high, low, probe;
+
+ // work on floor
+ high = array.length; low = -1;
+ while (high - low > 1)
+ {
+ probe = (high + low) / 2;
+ if (array[probe] < floor)
+ low = probe;
+ else
+ high = probe;
+ }
+ answer[0] = low;
+
+ // work on ceiling
+ high = array.length; low = -1;
+ while (high - low > 1)
+ {
+ probe = (high + low) / 2;
+ if (array[probe] > ceiling)
+ high = probe;
+ else
+ low = probe;
+ }
+ answer[1] = high;
+ return answer;
+}