4. 二分搜索

    实现一个函数,在一个已排好序的整型数组中进行二分搜索,找到给定整数的数组下标。是用下面的方法声明:

    int BinarySearch(int array[], int lower, int upper, int target);

    讨论这种搜索的效率,并与其他搜索方法进行比较。

    程序实现的代码如下:

    #include "stdafx.h"

    #include <iostream.h>

 

    #define E_TARGET_NOT_IN_ARRAY -1

    #define E_ARRAY_UNORDERED -2

    #define E_LIMITS_REVERSED -3

 

    int BinarySearch(int array[], int lower, int upper, int target)

    {

        int center, range;

 

        range = upper - lower;

        if(range < 0)

        {

            return E_LIMITS_REVERSED;

        }

        else if(range == 0 && array[lower] != target)

        {

            return E_TARGET_NOT_IN_ARRAY;

        }

 

        if(array[lower] > array[upper])

        {

            return E_ARRAY_UNORDERED;

        }

 

        center = (range / 2) + lower;

 

        if(target == array[center])

        {

            return center;

        }

        else if(target < array[center])

        {

            return BinarySearch(array, lower, center - 1, target);

        }

        else

        {

            return BinarySearch(array, center + 1, upper, target);

        }

    }

 

    int iterBinarySearch(int array[], int lower, int upper, int target)

    {

        int center, range;

 

        if(lower > upper)

            return E_LIMITS_REVERSED;

 

        while(1)

        {

            range = upper - lower;

            if(range == 0 && array[lower] != target)

                return E_TARGET_NOT_IN_ARRAY;

 

            if(array[lower] > array[upper])

                return E_ARRAY_UNORDERED;

 

            center = (range / 2) + lower;

          

            if(target == array[center])

            {

                return center;

            }

            else if(target < array[center])

            {

                upper = center - 1;

            }

            else

            {

                lower = center + 1;

            }

        }

    }

 

    int main()

    {

        int a[] = {1, 3, 5, 6, 9, 12, 27, 89, 229, 301};

 

        for(int i = 0; i < 10; i++)

            cout << a[i] << ' ';

 

        cout << endl;

 

        int b = BinarySearch(a, 0, 9, 8);

        cout << "递归方法查找到的数字下标为:" << b << endl;

 

        int c = iterBinarySearch(a, 0, 9, 12);

        cout << "非递归方法查找到的数字下标为:" << c << endl;

 

        return 0;

    }

 

    程序的执行结果如下:

 

    二分搜索的时间复杂度为O(log(n)),因为每次迭代都排除了一半要搜索的元素。这比简单搜索所有元素更有效率,简单搜索的时间复杂度为O(n)。

    但是,为了进行二分搜索,数组必须已经排好序,这个操作的时间复杂度通常是O(nlog(n)),除非这个数组总是按顺序存放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值