BinarySearch 有序表的二分查找

BinarySearch 有序表的二分查找

思路:
前提是线性表采用顺序存储(通常从小到大),然后在有序表中取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若小于,则在中间记录的左半区继续查找;若大于,在中间记录的右半区继续查找 。

注:时间复杂度为O(logn),远远好于顺序查找的O(n)。

代码实现:

//BinarySearch 有序表的二分查找
#include 
using namespace std;

int BinarySearch(int *p, int n, int key){
    int low, high, mid;
    low = 0;
    high = n - 1;
    while (low < high){
        mid = (low + high) / 2;
        if (key < *(p + mid)){//若小于中间值,则high=mid-1
            high = mid - 1;
        }
        else if (key>*(p + mid)){//若大于中间值,则low=mid+1
            low = mid + 1;
        }
        else{//若给定值与中间记录的关键字相等,则查找成功
            return mid;
        }
    }
}

int main(){

    int a[] = { 1, 16, 24, 35, 47, 59, 62, 73, 88, 99 };
    int *p = a;
    int aSize = sizeof(a) / sizeof(a[0]);//计算数组size
    int key;//输入的要查找的数
    int result;//返回的找到的数的下标,如果不是则为任意值
    cout << "Please input the number you want to search:";
    cin >> key;
    result=BinarySearch(p, aSize, key);
    if (key == a[result]){
        cout << "在a[" << result << "]找到" << key << endl;
    }
    else{
        cout << "没找到" << key << endl;
    }

    return 0;
}

运行结果:
BinarySearch 有序表的二分查找_第1张图片
BinarySearch 有序表的二分查找_第2张图片

你可能感兴趣的:(查找算法,C/C++)