00001
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 int sort(unsigned long n,float *arr)
00008 {
00009 unsigned long i,ir=n,j,k,l=1,*istack;
00010 int jstack=0;
00011 float a,temp;
00012 int status=0;
00013 istack=lvector(1,NSTACK,&status);
00014 if (status<0) return(-1);
00015 for (;;) {
00016 if (ir-l < M) {
00017 for (j=l+1;j<=ir;j++) {
00018 a=arr[j];
00019 for (i=j-1;i>=l;i--) {
00020 if (arr[i] <= a) break;
00021 arr[i+1]=arr[i];
00022 }
00023 arr[i+1]=a;
00024 }
00025 if (jstack == 0) break;
00026 ir=istack[jstack--];
00027 l=istack[jstack--];
00028 } else {
00029 k=(l+ir) >> 1;
00030 SWAP(arr[k],arr[l+1])
00031 if (arr[l] > arr[ir]) {
00032 SWAP(arr[l],arr[ir])
00033 }
00034 if (arr[l+1] > arr[ir]) {
00035 SWAP(arr[l+1],arr[ir])
00036 }
00037 if (arr[l] > arr[l+1]) {
00038 SWAP(arr[l],arr[l+1])
00039 }
00040 i=l+1;
00041 j=ir;
00042 a=arr[l+1];
00043 for (;;) {
00044 do i++; while (arr[i] < a);
00045 do j--; while (arr[j] > a);
00046 if (j < i) break;
00047 SWAP(arr[i],arr[j]);
00048 }
00049 arr[l+1]=arr[j];
00050 arr[j]=a;
00051 jstack += 2;
00052 if (jstack > NSTACK) {
00053
00054 return -1;
00055 }
00056 if (ir-i+1 >= j-l) {
00057 istack[jstack]=ir;
00058 istack[jstack-1]=i;
00059 ir=j-1;
00060 } else {
00061 istack[jstack]=j-1;
00062 istack[jstack-1]=l;
00063 l=i;
00064 }
00065 }
00066 }
00067 free_lvector(istack,1,NSTACK);
00068 return 0;
00069 }
00070 #undef M
00071 #undef NSTACK
00072 #undef SWAP