编程技术记录

世界你好!


//在升序数组中,查找插入索引 ,插入索引是第一个恰当的位置(多个相同元素的第一个元素位置)
//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;
    }
}

发表回复

© Beli. All Rights Reserved.