Java中常用的查找算法——顺序查找和二分查找
Java中常用的查找算法——顺序查找和二分查找
一、顺序查找:
a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位。
b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8
代码演示:
import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch {
public static void main(String[] arg) {
int[] a={4,6,2,8,1,9,0,3};
Scanner input=new Scanner(System.in);
System.out.println("请输入你要查找的数:");
//存放控制台输入的语句
int num=input.nextInt();
//调用searc()方法,将返回值保存在result中
int result=search(a, num);
if(result==-1){
System.out.println("你输入的数不存在与数组中。");
}
else
System.out.println("你输入的数字存在,在数组中的位置是第:"+(result+1)+"个");
}
public static int search(int[] a, int num) {
for(int i = 0; i < a.length; i++) {
if(a[i] == num){//如果数据存在
return i;//返回数据所在的下标,也就是位置
}
}
return -1;//不存在的话返回-1
}
}
运行截图:
二、二分查找
a) 前提条件:已排序的数组中查找
b) 二分查找的基本思想是:首先确定该查找区间的中间点位置: int mid = (low+upper) / 2;然后将待查找的值与中间点位置的值比较:若相等,则查找成功并返回此位置。若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域。若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域。下一次查找是针对新的查找区间进行的。
c) 图例说明:
原始数据: int[] a={5,3,6,1,9,8,2,4,7}; 查找是否存在数字8;
第一步,先用之前学过的排序方法将数组按升序排序:int[] a={1,2,3,4,5,6,7,8,9};
第二步,取中间数:5跟8比较,8大于5 ,取中间数右侧的数组进行比较,即{6,7,8,9}
第三步:重复第一步和第二步,直到找到数据或者比较完所有数据。
d) 代码示例:
import java.util.Scanner;
/*
* 二分查找
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr={5,3,6,1,9,8,2,4,7};
//先打印输出原始数组数据
System.out.println("原始数组数据如下:");
for (int n : arr) {
System.out.print(n+" ");
}
System.out.println();
//首先对数组进行排序,这里用冒泡排序
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//遍历输出排序好的数组
System.out.println("经过冒泡排序后的数组:");
for(int n:arr){
System.out.print(n+" ");
}
System.out.println();//换行
Scanner input=new Scanner(System.in);
System.out.println("请输入你要查找的数:");
int num=input.nextInt();
int result=binarySearch(arr, num);
if(result==-1){
System.out.println("你要查找的数不存在……");
}
else{
System.out.println("你要查找的数存在,在数组中的位置是:"+result);
}
}
//二分查找算法
public static int binarySearch(int[] arr,int num){ int low=0;
int upper=arr.length-1;
while(low<=upper){
int mid=(upper+low)/2;
if(arr[mid]<num){
low=mid+1;
}
else if(arr[mid]>num){
upper=mid-1;
}
else
return mid;
}
return -1;
}
}
运行截图:
Java中常用的查找算法——顺序查找和二分查找的更多相关文章
- JAVA中常用需要设置的三个环境变量(JAVA_HOME、CLASSPATH、PATH)
JAVA中常用需要设置的三个环境变量: JAVA_HOME.CLASSPATH.PATH (一) 配置环境变量:(相对路径) 1. JAVA_HOME=x:/jdk1.6.0 2. 用%JAVA_HO ...
- java 中常用的类
java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l static double abs(double a) 获取double 的绝对值 l sta ...
- java中常用的工具类(二)
下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- java中常用的字符串的截取方法
java中常用的字符串的截取方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...
- 【Java】Java中常用的String方法
本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 动图+源码,演示 Java 中常用数据结构执行过程及原理
阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...
- Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...
- java中常用的工具类(三)
继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 ...
随机推荐
- Android布局尺寸思考
一.初步思考 虽然安卓的这个显示适配的方案有点怪,最初也不容易马上理解,不过这个方案确实有其自己的道理,整个思路是清晰的,方案的也是完整的,没有硬伤 安卓采用的[屏幕密度放缩机制].与web前端对应的 ...
- Lambda表达式演变
Lambda表达式是一种匿名函数. 演变步骤: 一般的方法委托 => 匿名函数委托 => Lambda表达式 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈La ...
- 需要正确安装 Microsoft.Windows.ShellExperienceHost 和 "Microsoft.Windows.Cortana" 应用程序。
windows 10 开始菜单修复工具 Win10开始菜单修复工具出现的原因,自从升级到Windows 10,一直BUG不断,而其中有一个BUG非常的让你印象深刻,就是开始菜单无响应,你用着用着电脑 ...
- DES加密解密
加密后生成Base64字符串,并去除'='字符. 加密后替换掉'+',这样加密后的字符串可以作为url参数传递. using System; using System.IO; using System ...
- oracle 查询周的第一天日期
项目的开发中需要用到一个查询周的第一天日期的函数 搜索N久很难找到解决的方法 只要自己写一个先用着 代码如下 a_week格式为 'YYYYIW' 如 '200801'表示2008年的第一周 周使用I ...
- 炉石传说 C# 开发笔记
最近在大连的同事强力推荐我玩 炉石传说,一个卡牌游戏.加上五一放一个很长很长的假期,为了磨练自己,决定尝试开发一个C#的炉石传说. 这件事情有人已经干过了,开发了一个网页版的炉石,但是貌似不能玩... ...
- Microsoft.Practices.Unity入门
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- mybatis笔记2 基础理论准备
之前发了一篇mybatis的crud入门笔记,算是入门了,为了让功力加深一级,来研究下mybatis的理论知识,哈哈,以后好拿来跟技术经理吹吹牛- 按照问题来吧!个人觉得有自主意识,带着自己的问题来研 ...
- Scalaz(38)- Free :Coproduct-Monadic语句组合
很多函数式编程爱好者都把FP称为Monadic Programming,意思是用Monad进行编程.我想FP作为一种比较成熟的编程模式,应该有一套比较规范的操作模式吧.因为Free能把任何F[A]升格 ...
- Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus
在前面的几篇讨论里我们初步对FP有了些少了解:FP嘛,不就是F[A]吗?也是,FP就是在F[]壳子(context)内对程序的状态进行更改,也就是在F壳子(context)内施用一些函数.再直白一点就 ...