protected int SimpleSelect1(int rank)
{
if (rank <= 0) {
return -1;
}
// var G = new ListGen<int> ((int i) => this.Rank1 (i), this.Count);
// return GenericSearch.FindFirst<int> (rank, G);
var n = this.Count;
int sp = 0;
int ep = n;
int cmp = 0;
int mid;
do {
mid = (sp >> 1) + (ep >> 1);
var rank_mid = this.Rank1 (mid);
cmp = rank.CompareTo(rank_mid);
if (cmp > 0) {
sp = mid + 1;
} else {
ep = mid;
}
} while (sp < ep);
if (cmp < 0) {
mid--;
} else if (cmp > 0) {
if (mid < ep) {
if (mid + 1 < n) {
var rank_mid = this.Rank1 (mid+1);
if (rank.CompareTo (rank_mid) == 0) {
mid++;
}
}
}
}
return mid;
}