diff --git a/select_FR.c b/select_FR.c new file mode 100644 index 0000000000000000000000000000000000000000..268301d341783bea9356bc35217d902e5e2a694e --- /dev/null +++ b/select_FR.c @@ -0,0 +1,48 @@ +#include <math.h> +#define BIGPART 600 +#define SWAP(a,b) temp=(a);(a)=(b);(b)=temp; + +float select_FR(float arr[], int l_par, int r_par, int k) +{ + int n,i,j,ll,rr,l,r,s,sd; + float z,temp,t; + l=l_par; + r=r_par; + while (r>l) { + if (r-l > BIGPART) { + n=r-l+1; + i=k-l+1; + z=log(n); + s=(int)(0.5*exp(2.*z/3.)); + sd=(int)(0.5*sqrt(z*s*(n-s)/n)*((i-n/2)>0?1:-1)); + ll=(int)(k-i*s/n+sd); + if (l>ll) ll=l; + rr=(int)(k+(n-i)*s/n+sd); + if (r<rr) rr=r; + select_FR(arr,ll,rr,k); + } + t=arr[k]; + i=l; + j=r; + SWAP(arr[l],arr[k]); + if (arr[r]>t) {SWAP(arr[r],arr[l])} + while (i<j) { + SWAP(arr[i],arr[j]) + i++; + j--; + while (arr[i]<t) i++; + while (arr[j]>t) j--; + } + if (arr[l]==t) { + SWAP(arr[l],arr[j]) + } else { + j++; + SWAP(arr[j],arr[r]) + } + if (j <= k) l = j + 1; + if (k <= j) r = j - 1; + } + return arr[k]; +} +#undef SWAP +#undef BIGPART