问题

  • 给定一个整数X和整数A0,A1,A2.....AN-1,后者已经预先排序完成,求使得X=Ai的下标i,若X不在数据中则返回-1;

问题分析:

  • 最简单的方法为从头到尾对整数组进行遍历操作,但是这种做实际上没有用到数组已经排序完成这一条件,因此效率较低。
  • 对于这类查找可以采用二分查找的方式。

算法分析:

  • 直接验证X与居中元素的大小关系,如果大于就继续验证X与右侧元素组的居中元素的大小关系,如果小于就验证X与左侧元素组的居中元素大小关系,以此类推直到找到下标或得到X不在数组中的结论。

代码:

int BinarySearch(ElementType A[],ElementType X,int N)
{
    int Low,High,Mid;
    Low=0;High=N-1;
    while(High>=Low)
    {
        Mid = (High+Low)/2;
        if(A[Mid]<X)
        {
            Low = Mid+1;
        }
        else if(A[Mid]>X)
        {
            High = Mid-1;
        }
        else
            return Mid;
    }
    return NotFound;
}

时间复杂度:

  • 算法的时间复杂度计算有某种原则:即如果每次循环能够将问题的规模-1,那么时间复杂度就是O(N),如果每次循环能够将问题的规模减半,那么时间复杂度就是O(log N)
  • 对于该算法,循环起点为High-Low=N-1开始,循环终点为High-Low=-1,每次循环High-Low的值都会减半,因此时间复杂度为O(log N)
posted on 2020-03-05 20:50  Moriarty_cyh  阅读(82)  评论(0)    收藏  举报