【C++】c++实现二分查找

参考:

  1. https://blog.csdn.net/qq_31828515/article/details/51791833
  2. https://www.jianshu.com/p/13a854172b0c

一、二分查找

二分查找又称折半查找,在C和C++里,二分查找是针对有序数组所用的一种快速查找元素的方法

二、二分查找的条件以及优缺点

条件:针对有序数组(元素从小到大或从大到小)
优点:查询速度较快,时间复杂度为O(n)
缺点:有硬性条件的限制,而且即使查到后,插入与删除困难。

三、图解

在这里插入图片描述

四、实现方式

#include <iostream>  
  
using namespace std;  
  
/* 
*二分查找思想:1、数组从小到大排序;2、查找的key每次和中间数比较,如果key小于mid 
查找mid左侧的数组部分;如果key大于mid,则查找mid右侧的数组部分;如果相等,则直接返回mid。 
 
输入:排序数组-array,数组大小-aSize,查找值-key 
返回:返回数组中的相应位置,否则返回-1 
*/  

//非递归查找(循环)
int BinarySearch(int *array, int aSize, int key)  
{  
    if ( array == NULL || aSize == 0 )  
        return -1;  
    int low = 0;  
    int high = aSize - 1;  
    int mid = 0;  
  
    while ( low <= high )  
    {  
        mid = (low + high )/2;  
          
        if ( array[mid] < key)  
            low = mid + 1;  
        else if ( array[mid] > key )     
            high = mid - 1;  
        else  
            return mid;  
    }  
    return -1;  
}  

//递归  
int BinarySearchRecursive(int *array, int low, int high, int key)  
{  
    if ( low > high )  
        return -1;  
    int mid = ( low + high )/2;  
      
    if ( array[mid] == key )  
        return mid;  
    else if ( array[mid] < key )  
        return BinarySearchRecursive(array, mid+1, high, key);  
    else  
        return BinarySearchRecursive(array, low, mid-1, key);  
}  
  
int main()  
{  
    int array[10];  
    for (int i=0; i<10; i++)  
        array[i] = i;  
  
    cout<<"No recursive:"<<endl;  
    cout<<"position:"<<BinarySearch(array, 10, 6)<<endl;  
    cout<<"recursive:"<<endl;  
    cout<<"position:"<<BinarySearchRecursive(array, 0, 9, 6)<<endl;  
  
    return 0;  
}  

推荐使用非递归的方式,因为递归每次调用递归时有用堆栈保存函数数据和结果。能用循环的尽量不用递归

五、小结

二分查找对有序数组来说查询速度快

优化

可以用:

int mid = left - (left - right)/2; //防止越界

int mid = left&right+(left^right)>>1;//进行计算机最喜欢的位运算,效率略高

来代替 求两个数的平均值的操作。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值