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