54 lines
802 B
C++
54 lines
802 B
C++
#include "nr.h"
|
|
|
|
void NR::hunt(Vec_I_DP &xx, const DP x, int &jlo)
|
|
{
|
|
int jm,jhi,inc;
|
|
bool ascnd;
|
|
|
|
int n=xx.size();
|
|
ascnd=(xx[n-1] >= xx[0]);
|
|
if (jlo < 0 || jlo > n-1) {
|
|
jlo=-1;
|
|
jhi=n;
|
|
} else {
|
|
inc=1;
|
|
if (x >= xx[jlo] == ascnd) {
|
|
if (jlo == n-1) return;
|
|
jhi=jlo+1;
|
|
while (x >= xx[jhi] == ascnd) {
|
|
jlo=jhi;
|
|
inc += inc;
|
|
jhi=jlo+inc;
|
|
if (jhi > n-1) {
|
|
jhi=n;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
if (jlo == 0) {
|
|
jlo=-1;
|
|
return;
|
|
}
|
|
jhi=jlo--;
|
|
while (x < xx[jlo] == ascnd) {
|
|
jhi=jlo;
|
|
inc <<= 1;
|
|
if (inc >= jhi) {
|
|
jlo=-1;
|
|
break;
|
|
}
|
|
else jlo=jhi-inc;
|
|
}
|
|
}
|
|
}
|
|
while (jhi-jlo != 1) {
|
|
jm=(jhi+jlo) >> 1;
|
|
if (x >= xx[jm] == ascnd)
|
|
jlo=jm;
|
|
else
|
|
jhi=jm;
|
|
}
|
|
if (x == xx[n-1]) jlo=n-2;
|
|
if (x == xx[0]) jlo=0;
|
|
}
|