InputIterator RandomSelect(InputIterator begin, InputIterator end, InputIterator I) { InputIterator endElemt = end; InputIterator beginElemt = begin; --endElemt; if (beginElemt == endElemt) return beginElemt; InputIterator pos = RandomizedPartions(begin, end); if (pos > I){ return RandomSelect(begin, pos, I); }else if (pos < I){ return RandomSelect(++pos, end, I); } return pos; }
wgttype RandomSelect(wgttype *a, int start, int end, int i) { int q,k,j; if (start==end) return a[start]; q=RandomPartition(a,start,end); // printf("After rand partition, q:%d, end:%d\n",q,end); /* for(j=start;j<=end;j++) printf("%f,",a[j]); printf("\n"); abort(); */ k=q-start+1; if (k==i) return a[q]; if (i < k ) return RandomSelect(a,start,q-1,i); else return RandomSelect(a,q+1,end,i-k); }