//在升序数组中,查找插入索引 ,插入索引是第一个恰当的位置(多个相同元素的第一个元素位置)
//existSame ,输出YES时,返回的索引是相等的元素索引,输出NO,返回的索引是需要插入的位置索引
NSUInteger FindInsertIndex(NSArray * ascSortedItmes , id obj, BOOL &existSame,
int(^CompareTwoItem)(id item, id obj))
{
existSame = NO;
NSUInteger count = [ascSortedItmes count];
if (count > 0)
{
NSUInteger midIndex ,startIndex = 0 , endIndex = count -1 , safeN = count;
while (safeN--) //safeN 保证while一定会结束 ,可以去掉这个判断
{
midIndex = ((startIndex + endIndex) >> 1); // (startIndex + endIndex) / 2
id item = ascSortedItmes[midIndex];
int cmp = CompareTwoItem(item ,obj);
if (cmp >0 ) // item > obj
{
if (endIndex == startIndex // 此时 endIndex == midIndex == startIndex
|| midIndex == 0 )
{
return midIndex;
}
endIndex = midIndex -1;
}
else if (cmp == 0) //处理相等情况,确保插入的索引是第一个恰当的索引(多个相同元素的第一个元素位置)
{
if (midIndex == startIndex) //此时,startIndex到endIndex最多两个元素
{
existSame = YES;
return midIndex;
}
endIndex = midIndex;
}
else // item < obj
{
startIndex = midIndex + 1;
if (startIndex > endIndex) // 此时 midIndex == endIndex
{
return (startIndex < count) ? startIndex : count;
}
}
}
ASSERT(0);//上面查找算法有问题
return count;//表示附加到末尾
}
else
{
return 0;
}
}
发表回复
要发表评论,您必须先登录。