package com.wei.demo.Annotation;/*** 二分查找算法Java:循环方法和递归方法* 思想:我们查找的数组范围是low(0)~high(len-1)。每次查找中间的元素,我们猜测的数字是guess=(low+high)/2;* 实际数字为item,如果猜测数字guess小于item,那范围变为:guess+1~high,low=guess+1位置开始;* 如果猜测数字guess大于item,那就范围变为low~guess-1* 数组:必须是有序的* 结果:返回想要数字的位置*/
public class binary_search {public static void main(String[] args) {int[] array = {1, 2, 33, 55, 66, 88, 99, 567, 789, 999,1000,10001,100002};// index(array,item);System.out.println("循环方法猜测数字的位置为:"+index(array,33));System.out.println("递归方法猜测数字的位置为:"+binarySearch(array,0,array.length-1,33));}/*** 循环的方法* @param array* @param key* @return*/public static int index(int array[],int key){int low = 0;int high = array.length - 1;int middle = 0;// int guess = array[middle];//猜测的数字if (key < array[low] || key > array[high] || low >high){return -1;}while (low <=high){ //循环结束的条件是左边等于右边,那就是中间要找的数字middle = (low + high)/2;int guess = array[middle];//猜测的数字if (guess < key){ //如果猜测的数字小于实际数字,low就要从middle+1开始low = middle + 1;}else if (guess > key){//如果猜测的数字大于实际数字,那么high就要从middle-1开始high = middle - 1;}else{return middle;}}return -1;}/****递归的方式*/public static int binarySearch(int[] arrays,int low,int high,int key){if (key < arrays[low] || key > arrays[high] || low >high){return -1;}int middle = (low + high) / 2;if (arrays[middle] > key){return  binarySearch(arrays, low, middle - 1, key);}else if (arrays[middle] < key){return  binarySearch(arrays, middle + 1, high, key);}else{return middle;}}
}

1.时间复杂度分析:

最坏的情况下两种方式时间复杂度一样:O(log2 N)


最好情况下为O(1)

2.空间复杂度分析:

算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数
循环方式:
  由于辅助空间是常数级别的所以:
  空间复杂度是O(1);
递归方式:

递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:
 空间复杂度:O(log2N )

二分查找以及时间、空间复杂度相关推荐

  1. 递归二分查找时间复杂度、空间复杂度和稳定性

    递归 递归条件 自己调用自己 有结束条件 二分查找 二分查找对1~100乱序数字查找 l = list(range(1,101)) def bin_search(data_set,val):low = ...

  2. 二分查找法的实现和应用汇总

    此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...

  3. 算法(一):二分查找法

    算法基础: 一.大O表示法: 指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度): O(1)表示常数阶时间复杂度 O(log n),也叫对数时间复杂 ...

  4. 顺序查找与二分查找时间复杂度的比较

    注意要点:通过System.currentTimeMills();来获取当前时间,来计算该算法运行运算时间 ​​​​​​​顺序查找的时间复杂度为O(n) 二分查找的时间复杂度为O(log(n)) 但两 ...

  5. 常用的十种算法:二分查找,分治,动态规划,KMP

    常用的十种算法 一.二分查找算法(非递归) 1.1 二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行 ...

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

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

  7. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  8. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  9. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

最新文章

  1. PHP守护进程常用方法
  2. bash、dash(/bin/bash和/bin/sh)
  3. Input类,Vector3实例
  4. 对测试人员或开发人员来说相互沟通有多重要?
  5. PerfDog-移动端性能测试-基本使用
  6. java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好
  7. 继小米之后,360 也官宣造车!互联网企业造车到底哪家强?
  8. 一种多功能语音识别技术和音乐播放器相结合的方法
  9. 五一快乐假期每天都在上课qaq
  10. javascript异步编程之回调函数
  11. 网络抓取ts文件转mp4_TS格式的视频文件怎么转换成mp4文件。
  12. LUAT游戏第一弹---贪吃蛇
  13. tensorflow常用数据函数总结(tf.tile()、tf.expand_dims())
  14. Windows下vc开发chrome浏览器工程的一点粗浅理解和封装
  15. 解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题
  16. 自然语言处理(NLP)—分词-—word2vec
  17. html+css响应式旅游主题网站模板,旅游网站,企业文化新闻类网站,简单web假期课程作业
  18. 基于JSP仓储物资管理系统
  19. Linux终端自定义命令(超实用技巧)
  20. SSM+美食论坛系统 毕业设计-附源码191023

热门文章

  1. 【转】2007年度最有趣味的网站大全
  2. 请求参数GET、POST
  3. oracle重复值排序问题
  4. 老旧无线路由器的妙用
  5. 支付宝当面付扫码支付支付后不回调_对接支付宝当面付进行电脑网站和手机网站收款教程...
  6. 不知道要不要转行做IT的人必看
  7. 3dmax文件导入sketchup方法
  8. ffmpeg rtmp 花屏_FFmpeg视频抽帧那些事
  9. 每日刷题Day_15-17
  10. 好和弦-6-和弦的特点与应用