Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一、概念
二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法。
二、算法思想
搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
三、优缺点
二分查找算法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,二分查找算法适用于不经常变动而查找频繁的有序列表。
四、复杂度分析
(1) 时间复杂度
二分查找每次把搜索区域减少一半,时间复杂度为O(log(n));
(2)空间复杂度
O(1)
package lsg.ap.binarysearch;
import java.util.Arrays;
public class BinarySearch
{
/**
* 功能:二分法查找的一般实现方法
*@author: 梁山广
* 2016年4月11日下午6:32:30
* @param array
* @param target
* @return
*/
public static int binarySearch(int[] array,int target)
{
int bottem=1;
int top=array.length;
while(bottem<=top)
{
int middle=(bottem+top)/2;
if(target>array[middle])
{
bottem=middle+1;
}
else if(target<array[middle])
{
top=middle-1;
}
else
{
return middle;//找到指定元素后返回其下标
}
}
return -1;//找不到就返回-1
}
/**
* 功能:递归法实现二分查找
*@author: 梁山广
* 2016年4月11日下午6:34:58
* @param array
* @param targrt
*/
public static int BinarySearchRecursive(int[] array,int bottem,int top,int target)
{
while(bottem<=top)//防止溢出
{
int middle=(bottem+top)/2;
if(target>array[middle])
{
return BinarySearchRecursive(array,middle+1,top,target);
}
else if(target<array[middle])
{
return BinarySearchRecursive(array,bottem,middle,target);
}
else
{
return middle;
}
}
return -1;
}
/**
* 递归二分法查找到的最终封装
*/
public static int binarySearchRecursive(int[] array,int target)
{
int index=BinarySearchRecursive(array,1,array.length,target);
return index;
}
/**
*
* 输出相应数组的结果
* @param array
*/
private static void printArray(int[] array)
{
for(int value:array)
System.out.print(" "+value+" ");
System.out.println();
}
public static void main(String[] args)
{
int[] array=new int[]{8,3,2,1,7,4,6,5};
System.out.println("原始数组为:");
printArray(array);
Arrays.sort(array);
System.out.println("排序之后数组为:");
printArray(array);
System.out.println("待查找元素的下标为:");
System.out.println(binarySearchRecursive(array,5));
}
}
Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)的更多相关文章
- java基础之二分法查找
package p1; import java.util.*; public class Sortdob { public static void BubbleSort(int[] arr) { ...
- java基础50道编程题
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...
- JAVA基础50题
package package0530; import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;imp ...
- Java冒泡排序与二分法查找的代码随笔
package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- java数组之二分法查找
认识: 猜字游戏 步数 所猜的数 结果 可能值的范围 0 1~100 1 50 太高 1~49 2 25 太低 26~49 3 37 太高 26~36 4 31 太低 32~36 5 34 太 ...
- java基础---数组的查找算法(2)
一.查找的基本概念 查找分为有序查找和无序查找,这里均以数组为对象,有序查找指的是数组元素有序排列,无序查找指的是数组元素有序或无序排列 平均查找长度(Average Search Length,AS ...
- java基础知识回顾之javaIO类--File类应用:递归深度遍历文件
代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * ...
- Java基础知识强化之IO流笔记15:递归之删除带内容的目录案例
1. 需求:递归删除带内容的目录 分析: (1)封装目录 (2)获取该目录下的所有文件或者文件夹的File数组 (3)遍历该File数组,得到每一个File对象 (4)判断该File对 ...
随机推荐
- 由验证码和session丢失的引发原因
今天中午,突然完整验证码全部不能显示了,查看gd库是没问题的,然后发现网站登录不上,追查变天,无果. 然后两个小时过后,可能是网站压力小了,网站又恢复正常. 但是过一阵又来. 其实很明显不是代码的问题 ...
- NSString的常见方法
//1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astrin ...
- 002_base64的编码实现
一.先贴一张ASCII码的图 二.再贴一张base64转换规则的图 二.python代码实现.
- iOS自定义控件开发详解
http://blog.csdn.net/zhangao0086/article/details/45622875
- 修改delphi xe6 FMX Label字体颜色
delphi fmx的字体等设置默认与皮肤有关,用代码直接修改字体颜色等是无效的,如何才能用代码修改呢?请按以下方法就可以: 1.在Object inspector中取消StlyedSettings中 ...
- struts.xml 配置详解
struts.xml是我们在开发中利用率最高的文件,也是Struts2中最重要的配置文件. 一下分别介绍一下几个struts.xml中常用到的标签 1.<include> 利用includ ...
- JQuery中国省市区无刷新三级联动查询
之前有写过用<Ajax控件来实现中国的省市区无刷新查询> 今天用JQuery来实现,用Ajax控件和JQuery的优缺点就先不说了. 效果图如下: 下面来结合代码来详细说明一下如何用JQu ...
- Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回 ...
- mysql 数据库授权
1: GRANT ALL PRIVILEGES ON share_db.* to 'db_user'@'%' IDENTIFIED BY 'db_user'; 2:FLUSH PRIVILEGES;
- Linux console on LCD
有时候需要将开机启动的信息输出到LCD上,并且在终端上进行调试.本文记录更改的方法. 参考链接 http://blog.csdn.net/chenbang110/article/details/787 ...