二分搜索技术实现

一、算法介绍

    折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。

注:二分搜索技术的使用前必须对待查找序列进行排序

二、核心代码

    非递归实现二分查找算法

int BinarySearch(int *L, int l, int r, int n)
{//二分搜索非递归实现
    while(l <= r)
    {
        int mid = (l+r) / 2;
        if(n == L[mid])
            return mid;
        else if (n > L[mid])//数据在右半区
            l = mid + 1;
        else//数据在左半区
            r = mid - 1;
    }

    return -1;
}

递归实现二分查找算法

int BinarySearch(int *L, int l, int r, int n)
{//二分搜索递归实现
    int mid = (l+r)/2;
    //终止条件
    if(l > r)
        return -1;
    if(n == L[mid])
        return mid;
    else if(n > L[mid])
        mid = BinarySearch(L, mid+1, r, n);//数据在右半区
    else
        mid = BinarySearch(L, l, mid - 1, n);//数据在左半区

    return mid;
}

 

三、整体代码

#include 

using namespace std;

int Compare(const void *a, const void *b)
{//比较函数
    return *(int*)a - *(int*)b;//升序排序
}

int BinarySearch(int *L, int l, int r, int n)
{//二分搜索非递归实现
    while(l <= r)
    {
        int mid = (l+r) / 2;
        if(n == L[mid])
            return mid;
        else if (n > L[mid])//数据在右半区
            l = mid + 1;
        else//数据在左半区
            r = mid - 1;
    }

    return -1;
}

//int BinarySearch(int *L, int l, int r, int n)
//{//二分搜索递归实现
//    int mid = (l+r)/2;
//    //终止条件
//    if(l > r)
//        return -1;
//    if(n == L[mid])
//        return mid;
//    else if(n > L[mid])
//        mid = BinarySearch(L, mid+1, r, n);//数据在右半区
//    else
//        mid = BinarySearch(L, l, mid - 1, n);//数据在左半区
//
//    return mid;
//}

int main()
{
    //定义
    int L[1010];
    int n;
    int len = 1000;
    int l = 0;
    int r = len-1;
    int ans = -1;
    //初始化样例
    for(int i= 0;i < len;i++)
        L[i] = len - i;
    //输入
    scanf("%d", &n);
    //处理
    qsort(L, len, sizeof(int), Compare);//排序
    ans = BinarySearch(L, l, r, n);//二分查找;
    //输出
    if( ans == -1)
        printf("未找到!");
    else
        printf("%d" , ans);
    return 0;
}

 

2019/4/22  修改:

    经他人提醒,发现代码在为查找到指定数据后,显示为0的问题。原因在于c++中int返回类型在未指定返回值时,统一执行return 0 语句。

你可能感兴趣的:(算法设计)