summaryrefslogtreecommitdiffstats
path: root/funtools/bsearch.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-25 20:57:49 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-25 20:57:49 (GMT)
commitd1c4bf158203c4e8ec29fdeb83fd311e36320885 (patch)
tree15874534e282f67505ce4af5ba805a1ff70ec43e /funtools/bsearch.c
parente19a18e035dc4d0e8e215f9b452bb9ef6f58b9d7 (diff)
parent339420dd5dd874c41f6bab5808291fb4036dd022 (diff)
downloadblt-d1c4bf158203c4e8ec29fdeb83fd311e36320885.zip
blt-d1c4bf158203c4e8ec29fdeb83fd311e36320885.tar.gz
blt-d1c4bf158203c4e8ec29fdeb83fd311e36320885.tar.bz2
Merge commit '339420dd5dd874c41f6bab5808291fb4036dd022' 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;
+}