69,336
社区成员
发帖
与我相关
我的任务
分享
/*
int minIdx = mid;
while ( minIdx>low && entry[minIdx-1]==value ) {
minIdx--;
}
*/
high = mid; // 现在的目标是查找最小下标
while ( low < high ) { // 重复循环直到low == high
mid = ( low + high ) / 2;
if ( entry[mid] == value ) { // 最小下标在mid之前(或mid)
high = mid;
} else { // 最小下标在mid之后
low = mid + 1;
}
}
int minIdx = low;
// 对数组进行折半查找
// 对于成功的查找,返回该值在数组中的范围(即最小索引和最大索引)
// 对于不成功的查找,返回null
public Bound search( int value ) throws IllegalArgumentException {
int low = 0;
int high = size - 1;
int mid;
while ( low <= high ) {
mid = (low + high) / 2;
if ( entry[mid] < value ) {
low = mid + 1;
} else if ( entry[mid] > value ) {
high = mid - 1;
} else {
// 确认数组中含有该值,下一步是确认该值在数组中的分布范围
// 确认该值的最小索引
int minIdx = mid;
while ( minIdx>low && entry[minIdx-1]==value ) {
minIdx--;
}
// 确认该值的最大索引
int maxIdx = mid;
while ( maxIdx<high && entry[maxIdx+1]==value ) {
maxIdx++;
}
return new Bound( minIdx, maxIdx );
}
}
return null;
}
/**
* @brief Finds the first position in which @a val could be inserted
* without changing the ordering.
* @param first An iterator.
* @param last Another iterator.
* @param val The search term.
* @return An iterator pointing to the first element "not less
* than" @a val, or end() if every element is less than
* @a val.
* @ingroup binary_search_algorithms
*/
template<typename _ForwardIterator, typename _Tp>
_ForwardIterator
lower_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
typedef typename iterator_traits<_ForwardIterator>::difference_type
_DistanceType;
// concept requirements
__glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
__glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
__glibcxx_requires_partitioned_lower(__first, __last, __val);
_DistanceType __len = std::distance(__first, __last);
_DistanceType __half;
_ForwardIterator __middle;
while (__len > 0)
{
__half = __len >> 1;
__middle = __first;
std::advance(__middle, __half);
if (*__middle < __val)
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else
__len = __half;
}
return __first;
}