00001
00002 #include "nrutil.h"
00003 #define SWAP(a,b) itemp=(a);(a)=(b);(b)=itemp;
00004 #define M 7
00005 #define NSTACK 50
00006
00007 int indexx(unsigned long n,float *arr,unsigned long *indx)
00008 {
00009 unsigned long i,indxt,ir=n,itemp,j,k,l=1;
00010 int jstack=0,*istack;
00011 float a;
00012 int status=0;
00013 istack=ivector(1,NSTACK,&status);
00014 if (status<0) return(-1);
00015 for (j=1;j<=n;j++) indx[j]=j;
00016 for (;;) {
00017 if (ir-l < M) {
00018 for (j=l+1;j<=ir;j++) {
00019 indxt=indx[j];
00020 a=arr[indxt];
00021 for (i=j-1;i>=l;i--) {
00022 if (arr[indx[i]] <= a) break;
00023 indx[i+1]=indx[i];
00024 }
00025 indx[i+1]=indxt;
00026 }
00027 if (jstack == 0) break;
00028 ir=istack[jstack--];
00029 l=istack[jstack--];
00030 } else {
00031 k=(l+ir) >> 1;
00032 SWAP(indx[k],indx[l+1]);
00033 if (arr[indx[l]] > arr[indx[ir]]) {
00034 SWAP(indx[l],indx[ir])
00035 }
00036 if (arr[indx[l+1]] > arr[indx[ir]]) {
00037 SWAP(indx[l+1],indx[ir])
00038 }
00039 if (arr[indx[l]] > arr[indx[l+1]]) {
00040 SWAP(indx[l],indx[l+1])
00041 }
00042 i=l+1;
00043 j=ir;
00044 indxt=indx[l+1];
00045 a=arr[indxt];
00046 for (;;) {
00047 do i++; while (arr[indx[i]] < a);
00048 do j--; while (arr[indx[j]] > a);
00049 if (j < i) break;
00050 SWAP(indx[i],indx[j])
00051 }
00052 indx[l+1]=indx[j];
00053 indx[j]=indxt;
00054 jstack += 2;
00055 if (jstack > NSTACK) {
00056
00057 return -1;
00058 }
00059 if (ir-i+1 >= j-l) {
00060 istack[jstack]=ir;
00061 istack[jstack-1]=i;
00062 ir=j-1;
00063 } else {
00064 istack[jstack]=j-1;
00065 istack[jstack-1]=l;
00066 l=i;
00067 }
00068 }
00069 }
00070 free_ivector(istack,1,NSTACK);
00071 return 0;
00072 }
00073 #undef M
00074 #undef NSTACK
00075 #undef SWAP