关于二分查找法

在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度,往往用牺牲空间换时间的方法提高时间效率。

时间复杂度按优劣排差不多集中在:

O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)

二分查找法主要是解决在“一堆数中找出指定的数”这类问题,而想要应用二分查找法,这“一堆数”必须有一下特征:

  • 存储在数组中

  • 有序排列

所以如果是用链表存储的,就无法在其上应用二分查找法了。

至于是顺序递增排列还是递减排列,数组中是否存在相同的元素都不要紧。不过一般情况,我们还是希望并假设数组是递增排列,数组中的元素互不相同。

二分查找程序实现:

#include<iostream>

using namespace std;

//while循环实现

int Binary_Search1(int array[], int n, int value)

{

int left = 0;

int right = n-1;

while (left <= right)//注意这里是"<="还是"=",若为"=",则循环里改为right = middle

{

int middle = left + ((right - left) >> 2);//直接平均可能會溢位,所以用此算法

if (array[middle] > value)

{

right = middle - 1;

}

else if(array[middle] < value)

{

left = middle + 1;

}

else

{

return middle;

}

}

return -1;

}

//递归实现

int Binary_Search2(int array[], int left,int right, int value)

{

if (left > right)//二分查找要有序

{

return -1;

}

int middle = left + ((right - left) >> 2);//直接平均可能會溢位,所以用此算法

if (array[middle] > value)

{

return Binary_Search2(array, left, middle - 1, value);

}

else if (array[middle] < value)

{

return Binary_Search2(array, middle + 1, right, value);

}

else

{

return middle;

}

}

int main()

{

int array[10] = { 1,2,3,5,7,8,9,11,13,45 };

int n = 0, num = 0,ret=0;

n = sizeof(array);

/*int left = 0, right = n-1;*/

cin >> num;

ret = Binary_Search1(array, n, num);

/*ret = Binary_Search2(array, left,right, num);*/

if (ret == -1)

{

cout << "查找失败!"<< endl;

}

else

{

cout << num << "是第" << ret + 1 << "个数" << endl;

}

system("pause");

return 0;

}

运行结果1:

8

8是第6个数

请按任意键继续. . .

运行结果2:

17

查找失败!

请按任意键继续. . .

二分查找法的缺陷

二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:

     必有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。

解决这些缺陷问题更好的方法应该是使用二叉查找树了,最好自然是自平衡二叉查找树了,高效的(O(n logn))构建有序元素集合,又能如同二分查找法一样快速(O(log n))的搜寻目标数。

转载于:https://blog.51cto.com/yaoyaolx/1775691

二分查找算法的递归、循环实现及其缺陷相关推荐

  1. 二分查找算法(非递归)

    1.二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 ...

  2. python递归实现二分查找_python二分查找算法的递归实现

    本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...

  3. python递归实现二分查找_python二分查找算法的递归实现方法

    本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...

  4. 二分查找算法(递归+非递归)

    二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较: ...

  5. 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...

  6. 二分查找算法(递归方式)

    文章目录 基本思想 代码示例 复杂度分析 尾注 基本思想 二分查找算法,也叫折半搜索算法,一般来讲,二分查找算法常用于一个有序数组(也可以用于无序数组,下一节讲解).在搜索时,首先选择一个中点,如果中 ...

  7. 二十一、二分查找算法(递归非递归)

    一.二分查找思路分析 1.首先确定该数组中间的下标 ,即mid=(left+high)/2; 2.然后让需要查找的value值与array[mid]值进行比较 2.1)findVal > arr ...

  8. 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)

    第十七章 二分查找(非递归)和分治算法(汉诺塔) 文章目录 第十七章 二分查找(非递归)和分治算法(汉诺塔) 一.二分查找 1.思路 2.代码实现 二.分治算法(汉诺塔) 1.概述 2.汉诺塔 一.二 ...

  9. 二分查找算法递归实现

    二分查找(Binary Search),又称折半查找,是一种效率较高的查找算法.折半查找需要线性表采用顺序存储结构,即查找的对象必须是一个有序序列.如{1,2,3,4,5...},{10 ,8,6,4 ...

最新文章

  1. 新版Bintray-极简上传Library到JCenter
  2. Introduction to Byteball — Part 4: Adoption
  3. java中spring的注解_spring中的各种注解解析
  4. java反编译,eclipse支持插件
  5. 【转】Wireshark网络抓包(一)——数据包、着色规则和提示
  6. 在Eclipse中使用SDK中的@hide函数
  7. win32开发(画笔、刷子、字体)
  8. IIS搭配Server-u构建企业空间服务(二)
  9. 华为音量键只能调通话_手机音量键还在以为只能调音量?别傻了,赶紧看看下文绝对涨知识!...
  10. 初学python-练习_1使用python编写计算班级学生平均分程序
  11. 在Android中使用自带API操作Json
  12. 票据通的支票管理的账户管理的对应账号支票已使用该怎么重新修改票据打印模板;
  13. 拒绝访问,文件或目录损坏且无法读取解决办法
  14. 阿里巴巴在知乎上又出事了
  15. 重卡自动驾驶进入“正规战”
  16. 广州大学计算机投档分数线,2021年广州大学最低投档分数线及录取位次
  17. 联想YOGA14s(2021) i5-11300H MX450双系统安装Ubuntu20.04全过程
  18. RTX 3080被炒到原价7倍,最高卖5000美元,英伟达官方道歉:将打击黄牛抢购
  19. html实现登录界面(附源码)
  20. ppt学习日记:L4-图片实战技巧

热门文章

  1. SpringBoot的启动过程
  2. SpringBoot 精通系列-SpringBoot如何操作Memcache
  3. redis常用命令(基础篇)
  4. 都快2022年了GraphQL还值得学吗?
  5. 问题:pom文件飘红, parent.relativePath
  6. javaweb基础知识点记录1
  7. 基于注解方式@AspectJ的AOP
  8. Get AD Object and disable move delete AD account script 查询删除AD账户计算机
  9. Python运维插件——psutil
  10. Android的5个进程等级(转)