数据结构之二分查找——Java语言实现
场景描述:给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置。
首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明待查找的数据不在数据序列中
顺序查找说明:
优点:实现简单,直接一个一个遍历判断即可
缺点:当数据是有序,并且数据不在数据序列中时,会查询N次才能确定数据不在数据序列中,查询次数较高,效率低。
针对有序的数据序列,可以从中间开始进行比较,因为是有序的,若中间值比目标值小,则目标值一定在前半部分序列或者不在序列中,然后依次进行比较。
这种查询方式就是数据结构中的二分查找,使用java语言实现(使用二分查找的前提条件:数据序列是有序的,否则不能使用此种方式)
列举实例: a[]= {18,21,23,34,56,65,78,88,90,92}; 需要查询数据是否在数据序列中?
使用顺序查找时:需要比较6次才能确定65在数据序列中
使用二分查找时:首先使用数据的中间值(low+high)/2得到 56,然后与65进行比较,56<65,所以数据一定在56的后面序列中;
然后再65到92中使用此种方式进行比较,{65,78,88,90,92},次数据序列中的中间值是88,88>65,所以数据一定是在65到88之间;
{65,78}同上方式所示,中间值是65,使用65与65比较,65==65,所以查找到65,一共比较3次,56,88,65;比较次数少于顺序比较,效率更高。
具体代码实现如下所示:
package com.three.fourteen;
public class QuickSort {
/**
* 使用二分查找
* @param args
*/
public int findData(int a[],int tar) {
int low=0;
int high=a.length-1;
int mid;
while(low<=high) {
mid=(low+high)/2;
System.out.println("和 "+a[mid]+" 进行比较");
if(low<high&&a[mid]==tar) return mid;
else if(low<high&&a[mid]>tar) high=mid-1;
else low=mid+1;
}
return -1;
}
public static void main(String[] args) {
int a[]= {18,21,23,34,56,65,78,88,90,92};
int tar=65;
QuickSort qs=new QuickSort();
int x=qs.findData(a, tar);
if(x!=-1) {
System.out.println("找到目标数据 65,在数据序列中的第 :"+(x+1) +" 个位置");
}else {
System.out.println("没有找到目标数据 65");
}
}
}
运行结果:

数据结构之二分查找——Java语言实现的更多相关文章
- 数据结构和算法设计专题之---二分查找(Java版)
1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...
- hdu 2141:Can you find it?(数据结构,二分查找)
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others ...
- 数据结构之二分查找(PHP)
<?php //二分查找算法 //前提:索引数组.数组已排好顺序 $a=array(1,3,4,6,8,9,11,13,15,24,25,27,30,38); $search = 30;//要查 ...
- 二分查找(Java)
二分查找的前提的要查找的数组必须有序. 代码如下: 程序1 public class source { public int binary_sort(int[] array, int item) { ...
- 二分查找(Java实现)
二分查找:递归实现 public class BinarySearch { /** * @param arr 代查找的数组,需要有序 * @param left 查找区间的左界限 * @param r ...
- python 数据结构之二分查找的递归和普通实现
二分查找就是待查找的列表进行分半搜索 如下所示 二分查找普通实现: def erfen(alist, item): start = 0 end = len(alist) - 1 while start ...
- 二分查找-Java版
/** * * 二分查找算法 * * * * @param srcArray 有序数组 * * @param target 查找元素 * * @return srcArray数组下标,没找到返回-1 ...
- 二分查找java实现
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 二分查找思路非常简单,由粗暴的遍历查找改为 ...
- 插曲一--记《数据结构与问题求解(Java语言版)(第4版)》翻译问题
在该书的527页中18.6理论题中,书中这样写道"完全结点是指每个结点都有两个孩子.证明,完全二叉树的结点数加1等于叶子树." 初看此题目,本人觉得很纳闷,再细细想之,发现似乎是个 ...
随机推荐
- Mac下搭建solr搜索引擎与PHP扩展开发(上)
首先需要安装jdk,前往 https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 自 ...
- python_WSGI接口
WSGI:Web Server Gateway Interface WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求.我们来看一个最简单的Web版本的“Hello, ...
- C++ Const指针
- centos7.5 修改网卡名称
1.修改网卡配置文件中名称信息 vim /etc/sysconfig/network-scripts/ifcfg-ens33 将其中的名称为ens33的改为eth0 ,并将uuid删除以便后面克隆 2 ...
- Java代码质量改进之:同步对象的选择
在Java中,让线程同步的一种方式是使用synchronized关键字,它可以被用来修饰一段代码块,如下: synchronized(被锁的同步对象) { // 代码块:业务代码 } 当synchro ...
- C#计算重重字符串,出现的次数
int bac = System.Text.RegularExpressions.Regex.Matches(“字符串”, @"要计算的").Count; //字符串 ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- 51Nod 博弈模板题
连刷3道博弈模板题,算是稍微学习了以下三个经典博弈了.推荐一个博客. 第一道模板:Bash博弈——同余理论 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度 ...
- String.split()与StringUtils.split()
我们平时进行简单的字符串分割的时候,尽量不要用String自身的split方法,它是匹配正则表达式的,如果遇到$这种特殊字符,需要转义一下.用StringUtils.split()方法会更方便 使用a ...
- python学习-----协程
一.协程的引入 对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算, ...