借鉴二分查找法找出制定容器内大于指定数值的元素个数
public static int countsBiger(final Integer[] array, final int i) {
final int idx;
final int len = array.length;
// 先排除首尾的
if (array[0] > i) {
return len;
}
if (array[len - 1] <= i) {
return 0;
}
// 如不包含则借鉴二分查找法进行查找
int midIdx = 0;
int n = 2;
int tag;
while ((tag = (len / n)) >= 0) {
midIdx = array[tag];
if (midIdx > i) {
if (tag == 0) {
break;
}
// 如果仍比指定值大则继续切割
n *= 2;
} else if (midIdx == i) {
break;
} else {
if (array[tag + 1] >= i) {
// 如果下个数字就不小于指定数字则结束循环,得出结果为 tag
break;
} else {
// 找出此区间(tag,lastTag)上次切割点)内第一个不小于i的元素
int lastTag = len / (n / 2);
while (lastTag - tag > 1) {
tag += (lastTag - tag) / 2;
if (array[tag] >= i) {
break;
}
}
break;
}
}
}
return len - 1 - tag;
}