折半查找(二分查找)

最基本的算法:
折半查找(二分查找)int BinarySearch(int arr[], int len, int searchKey)
折半查找(二分查找){
折半查找(二分查找)    int start = 0, end = len - 1, mid;
折半查找(二分查找)    while (start <= end)
折半查找(二分查找)    {
折半查找(二分查找)        // 求中间的索引值
折半查找(二分查找)
        mid = (start + end) / 2;
折半查找(二分查找)
折半查找(二分查找)        if (arr[mid] == number)
折半查找(二分查找)        {
折半查找(二分查找)            // 查到了
折半查找(二分查找)
            return mid;
折半查找(二分查找)        }

折半查找(二分查找)        else if (arr[mid] < searchKey)
折半查找(二分查找)        {
折半查找(二分查找)            // 搜索范围缩小到后半部
折半查找(二分查找)
            start = mid + 1;
折半查找(二分查找)        }

折半查找(二分查找)        else if (arr[mid] > searchKey)
折半查找(二分查找)        {
折半查找(二分查找)            // 搜索范围缩小到前半部
折半查找(二分查找)
            end = mid - 1;
折半查找(二分查找)        }

折半查找(二分查找)    }

折半查找(二分查找)
折半查找(二分查找)    // 没查到
折半查找(二分查找)
    return -1;
折半查找(二分查找)}


用到递归的算法:
折半查找(二分查找)int BinarySearch( const int arr[], int searchKey, int start, int end )
折半查找(二分查找){
折半查找(二分查找)    // 求中间的索引值
折半查找(二分查找)
    int mid = ( start + end ) / 2;
折半查找(二分查找)
折半查找(二分查找)    if ( searchKey == arr[ mid ] )
折半查找(二分查找)    {
折半查找(二分查找)        // 找到了
折半查找(二分查找)
        return mid;
折半查找(二分查找)    }

折半查找(二分查找)    else if ( searchKey < arr[ mid ] )
折半查找(二分查找)    {
折半查找(二分查找)        // 搜索范围缩小到前半部
折半查找(二分查找)
        return BinarySearch( arr, searchKey, start, mid - 1 );
折半查找(二分查找)    }

折半查找(二分查找)    else if ( searchKey > arr[ mid ] )
折半查找(二分查找)    {
折半查找(二分查找)        // 搜索范围缩小到后半部
折半查找(二分查找)
        return BinarySearch( arr, searchKey, mid + 1, end );
折半查找(二分查找)    }

折半查找(二分查找)    else
折半查找(二分查找)    {
折半查找(二分查找)        // 没有查找到
折半查找(二分查找)
        return -1;
折半查找(二分查找)    }

折半查找(二分查找)}


使用迭代实现:
折半查找(二分查找)int BinarySearch( const int arr[], const int& len, const int& searchKey )
折半查找(二分查找){  
折半查找(二分查找)    int start=0, end=len-1, mid;
折半查找(二分查找)    while ( start < end )
折半查找(二分查找)    {
折半查找(二分查找)        mid = (start + end) / 2;
折半查找(二分查找)
折半查找(二分查找)        if ( searchKey > arr[mid] )
折半查找(二分查找)        {
折半查找(二分查找)            start = mid + 1;
折半查找(二分查找)        }

折半查找(二分查找)        else
折半查找(二分查找)        {
折半查找(二分查找)            end = mid;
折半查找(二分查找)        }

折半查找(二分查找)    }

折半查找(二分查找)
折半查找(二分查找)    if ( start > end )
折半查找(二分查找)    {
折半查找(二分查找)        return -1;
折半查找(二分查找)    }

折半查找(二分查找)    else
折半查找(二分查找)    {
折半查找(二分查找)        if ( searchKey == arr[start] )
折半查找(二分查找)        {
折半查找(二分查找)            return start;
折半查找(二分查找)        }

折半查找(二分查找)        else
折半查找(二分查找)        {
折半查找(二分查找)            return -1;
折半查找(二分查找)        }

折半查找(二分查找)    }

折半查找(二分查找)}



测试代码:
折半查找(二分查找)void testBinarySearch()
折半查找(二分查找){
折半查找(二分查找)    const int LEN = 8;
折半查找(二分查找)    int a[LEN] = { 1, 2, 2, 2, 5, 6, 8, 9 };
折半查找(二分查找)
折半查找(二分查找)    printf("查找到的索引号为:%d\n", BinarySearch(a, LEN, 5));
折半查找(二分查找)
折半查找(二分查找)    printf("查找到的索引号为:%d\n", BinarySearch(a, 5, 0, LEN-1));
折半查找(二分查找)}
上一篇:[Step By Step]SAP HANA PAL 数据处理缩放算法Scaling实例SCALINGRANGE


下一篇:《VMware vSphere 6.0虚拟化架构实战指南》——2.3 安装VMware ESXi 6.0