*** empty log message ***
This commit is contained in:
parent
abe1725466
commit
8733f2528e
26
bisection.h
Normal file
26
bisection.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef _BISECTION_H
|
||||
#define _BISECTION_H
|
||||
//general bisection search
|
||||
//returns dm-1 on failure, otherwise number between dm and hm
|
||||
|
||||
template<typename INDEX, typename COMPAR, typename SUBJECT>
|
||||
INDEX bisection_find(INDEX dm, INDEX hm, const SUBJECT *key, const SUBJECT *base , unsigned int lead_dimension_base, COMPAR (*cmp)(const SUBJECT *, const SUBJECT *))
|
||||
{
|
||||
if(dm>hm) return(dm-1);
|
||||
if(dm==hm) return (*cmp)(base+dm*lead_dimension_base,key)? dm-1 :dm;
|
||||
INDEX sm;
|
||||
INDEX dm0=dm;
|
||||
--dm;
|
||||
++hm;
|
||||
do
|
||||
{
|
||||
sm = (dm+hm)/2;
|
||||
COMPAR q = (*cmp)(base+sm*lead_dimension_base,key);
|
||||
if (!q) return(sm);
|
||||
else if (q<0) dm = sm; else hm = sm;
|
||||
}
|
||||
while (hm > dm+1);
|
||||
return(dm0-1);
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user