#include "nr.h" void NR::indexx(Vec_I_DP &arr, Vec_O_INT &indx) { const int M=7,NSTACK=50; int i,indxt,ir,j,k,jstack=-1,l=0; DP a; Vec_INT istack(NSTACK); int n=arr.size(); ir=n-1; for (j=0;j=l;i--) { if (arr[indx[i]] <= a) break; indx[i+1]=indx[i]; } indx[i+1]=indxt; } if (jstack < 0) break; ir=istack[jstack--]; l=istack[jstack--]; } else { k=(l+ir) >> 1; SWAP(indx[k],indx[l+1]); if (arr[indx[l]] > arr[indx[ir]]) { SWAP(indx[l],indx[ir]); } if (arr[indx[l+1]] > arr[indx[ir]]) { SWAP(indx[l+1],indx[ir]); } if (arr[indx[l]] > arr[indx[l+1]]) { SWAP(indx[l],indx[l+1]); } i=l+1; j=ir; indxt=indx[l+1]; a=arr[indxt]; for (;;) { do i++; while (arr[indx[i]] < a); do j--; while (arr[indx[j]] > a); if (j < i) break; SWAP(indx[i],indx[j]); } indx[l+1]=indx[j]; indx[j]=indxt; jstack += 2; if (jstack >= NSTACK) nrerror("NSTACK too small in indexx."); if (ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } } void NR::indexx(Vec_I_INT &arr, Vec_O_INT &indx) { const int M=7,NSTACK=50; int i,indxt,ir,j,k,jstack=-1,l=0; int a; Vec_INT istack(NSTACK); int n=arr.size(); ir=n-1; for (j=0;j=l;i--) { if (arr[indx[i]] <= a) break; indx[i+1]=indx[i]; } indx[i+1]=indxt; } if (jstack < 0) break; ir=istack[jstack--]; l=istack[jstack--]; } else { k=(l+ir) >> 1; SWAP(indx[k],indx[l+1]); if (arr[indx[l]] > arr[indx[ir]]) { SWAP(indx[l],indx[ir]); } if (arr[indx[l+1]] > arr[indx[ir]]) { SWAP(indx[l+1],indx[ir]); } if (arr[indx[l]] > arr[indx[l+1]]) { SWAP(indx[l],indx[l+1]); } i=l+1; j=ir; indxt=indx[l+1]; a=arr[indxt]; for (;;) { do i++; while (arr[indx[i]] < a); do j--; while (arr[indx[j]] > a); if (j < i) break; SWAP(indx[i],indx[j]); } indx[l+1]=indx[j]; indx[j]=indxt; jstack += 2; if (jstack >= NSTACK) nrerror("NSTACK too small in indexx."); if (ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } }