数据结构之二分查找——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等于叶子树." 初看此题目,本人觉得很纳闷,再细细想之,发现似乎是个 ...
随机推荐
- Jenkins Pipeline脚本
node { echo 'Hello World' } node 在Jenkins环境中分配一个执行器和工作空间. echo 在控制台输出中写入简单的字符串 try { timeout(time: 1 ...
- phpstudy----------如何将phpstudy里面的mysql升级到指定版本,如何升级指定PHP版本
1.下载指定版本:从官网上下载高版本的 MySQL :https://dev.mysql.com/downloads/file/?id=467269,选的版本是 5.7.17 2.请注意第四部以前是可 ...
- Python记录13:软件开发目录规范
软件开发目录规范 开发一个软件,一个工程项目,一般应该具备以下的几个基本的文件夹和模块,当然,这并不是一成不变的,根据项目的不同会有一定的差异,不过作为一个入门级的新手,建议暂时按照以下的规范编写: ...
- python多线程学习二
本文希望达到的目标: 多线程同步原语:互斥锁 多线程队列queue 线程池threadpool 一.多线程同步原语:互斥锁 在多线程代码中,总有一些特定的函数或者代码块不应该被多个线程同时执行,通常包 ...
- HTTPS学习笔记一----HTTPS的基础理论知识
首先推荐一本书,<HTTP权威指南>我就是看这本书入门的,对http协议有了更好的理解,学习https的理论知识我认为需要了解以下几点,需要一步步的深入学习: 1.HTTPS的基本概念? ...
- Oarcle 入门之from关键字
作用:检索“表” 注意:检索的表后可以添加别名(别名不需要被双引号引起) *每一句都不可缺少
- LSTMs 长短期记忆网络系列
RNN的长期依赖问题 什么是长期依赖? 长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题. 如果从(1) “ 这块冰糖味道真?”来预测下一个词,是很容易得出“ ...
- D8 双连通分量
记得有个梗那一天,zw学生zzh大佬说逃不掉的路变成a不掉的题哈哈哈哈: 分离的路径: BZOJ 1718POJ 3177LUOGU 286: 思路:在同一个边双连通分量中,任意两点都有至少两条独立路 ...
- 剑指offer(7)斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...
- JavaScript 声明全局变量和局部变量
JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量 ...