查找算法四:二分查找(折半查找)

本文详细介绍了二分查找的基本原理及其在C++中的三种实现方式:非递归版本、递归版本及基于顺序表的查找。二分查找要求线性表采用顺序存储且元素按关键字有序排列,最坏情况下的时间复杂度为O(logn)。

1.原理简介

要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。最坏情况下,关键词比较次数为 log(n+1) ,时间复杂度:O(logn)

2.C++代码实现

(1)版本1

int BinarySearch1(int a[], int value, int n) //二分查找(折半查找),

{

    int low, high, mid;

    low = 0;

    high = n-1;

    while(low<=high)

    {

        mid = (low+high)/2;

        if(a[mid]==value)

            return mid;

        if(a[mid]>value)

            high = mid-1;

        if(a[mid]<value)

            low = mid+1;

    }

    return -1;

}

(2)递归版本

int BinarySearch2(int a[], int value, int low, int high) //二分查找,

{

    int mid = low+(high-low)/2;

    if(a[mid]==value)

        return mid;

    if(a[mid]>value)

        return BinarySearch2(a, value, low, mid-1);

    if(a[mid]<value)

        return BinarySearch2(a, value, mid+1, high);

}

(3)建立顺序变查找

#define MAXLEN 50

typedef struct

{

      int data[MAXLEN];

      int len;

}Seqlist;

int main()

{

      int i, n, x,low, high, mid;

      Seqlist *L;

      x = 3;

      L = (Seqlist*)malloc(sizeof(Seqlist));

      L->len = 0;

      cout << "Input length of List:";

      cin >> n;

      low = 1;high = n;L->len = n;

      cout << "Input element of List:" << endl;

      for (i = 1; i <= L->len; i++)

           cin >> L->data[i];

      for (i = 1; i <= L->len; i++)

           cout << L->data[i] << "  ";

      cout << endl;

      while (low <= high)

      {

           mid = (low + high) / 2;

           if (L->data[mid] == x)

           {

                 cout << mid;

                 return mid;

           }

           else

           {

                 if (L->data[mid] > x)

                      high = mid - 1;

                 if (L->data[mid] < x)

                      low = mid + 1;

           }

      }

      return -1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值