前提数组必须是有序的

定义最小,最大,中间的角标索引

        int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;

上面的索引需要变化,使用循环,条件:当中间值不等于目标值时

        int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key){
if(key<arr[mid]){ }else if(arr[mid]<key){ }
}

当中间值大于目标值时,最大角标移动到中间角标-1位置

当中间值小于目标值时,最小角标移动到中间角标+1位置

中间角标继续二分

        int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key){
if(key<arr[mid]){
max=mid-1;
}else if(arr[mid]<key){
min=mid+1;
}
mid=(min+max)/2;
}
return mid;

此时的代码有问题,当找不到目标时,会陷入死循环,加一个判断

如果一直找不到,最小角标和最大角标会错位

        int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key){
if(key<arr[mid]){
max=mid-1;
}else if(arr[mid]<key){
min=mid+1;
}
if(min>max) return -1;
mid=(min+max)/2;
}
return mid;

java版:

public class ArrayDemo {

    /**
* @param args
*/
public static void main(String[] args) {
int[] arr=new int[]{1,4,6,7,8,9};
System.out.println("索引:"+keySearch(arr,7));//索引:3
System.out.println("索引:"+helfSearch(arr,7));//索引:3
}
/**
* 二分查找
* @param arr
* @param key
* @return
*/
public static int helfSearch(int[] arr,int key){
int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]!=key){
if(key<arr[mid]){
max=mid-1;
}else if(arr[mid]<key){
min=mid+1;
}
if(min>max) return -1;
mid=(min+max)/2;
}
return mid;
}
/**
* 获取该值在数组中第一次出现的位置
* @param arr
* @param num
* @return
*/
public static int keySearch(int[] arr,int num){
for(int i=0;i<arr.length;i++){
if(arr[i]==num){
return i;
}
}
return -1;
}
}

PHP版:

<?php
class ArrayDemo{
public static function main(){
$arr=array(1,4,6,7,8,9);
echo "索引:".ArrayDemo::keySearch($arr,7);//索引:3
echo "索引:".ArrayDemo::helfSearch($arr,7);//索引:3
}
/**
* 二分查找
* @param arr
* @param key
* @return
*/
public static function helfSearch($arr,$key){
$min=0;
$max=count($arr)-1;
$mid=ceil(($min+$max)/2);
while($arr[$mid]!=$key){
if($key<$arr[$mid]){
$max=$mid-1;
}else if($arr[$mid]<$key){
$min=$mid+1;
}
$mid=ceil(($min+$max)/2);
if($min>$max) return -1;
}
return $mid;
}
/**
* 获取该值在数组中第一次出现的位置
* @param arr
* @param num
* @return
*/
public static function keySearch($arr,$key){
for($i=0;$i<count($arr);$i++){
if($arr[$i]==$key){
return $i;
}
}
return -1;
}
} ArrayDemo::main();

[javaSE] 数组(查找-二分查找)的更多相关文章

  1. 【转】Java实现折半查找(二分查找)的递归和非递归算法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...

  2. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  3. PHP-----二维数组和二分查找

    二维数组由行和列组成.由arr[$i][$j]表示,先后表示行和列,类似于坐标点. 打印二维数组-----通过两次遍历,第一次遍历每一行,第二次遍历每一行的具体元素,并且通过使用count($arr[ ...

  4. java 13-1 数组高级二分查找

    查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...

  5. leetcode旋转数组查找 二分查找的变形

    http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivo ...

  6. Java数据结构和算法总结-数组、二分查找

    前言:在平时开发中数组几乎是最基本也是最常用的数据类型,相比链表.二叉树等又简单很多,所以在学习数据和算法时用数组来作为一个起点再合适不过了.本篇博文的所有代码已上传 github ,对应工程的 ar ...

  7. [c/c++] programming之路(15)、多维数组和二分查找法,小外挂

    一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...

  8. [算法][LeetCode]Search a 2D Matrix——二维数组的二分查找

    题目要求 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...

  9. [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找

    一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...

随机推荐

  1. SSRS (一)创建基础报表

    ReportService创建基础报表 1.数据库SQL Server2012选择SQL Server Data Tools 2.创建商业智能(BI)项目 选择报表服务器项目 ReportServic ...

  2. c# 字符串去掉两端空格,并且将字符串中多个空格替换成一个空格

    字符串去掉两端空格,并且将字符串中多个空格替换成一个空格: 主要还是考察使用字符串的方法: trim(); 去掉字符串两端空格 split(); 切割 string.join(); 连接 class ...

  3. Jmeter——参数化的9种方法

    本文由作者张迎贞授权网易云社区发布. 一.用户定义的变量 1.右键快捷菜单中选择 添加-配置元件-用户自定义变量. 用户自定义变量中的定义的所有参数的值在测试计划的执行过程中不能发生取值的改变,因此一 ...

  4. JQuery Mobile - 修改复选框的选中状态无效解决办法!

    今晚,在编写JQuery Mobile程序时候,需要在代码里面控制复选框的选中状态,很简单的代码啊,很快完成了!等测试程序时候傻眼了,页面无论如何也不按照我写的代码显示出来!问题出在哪里呢?是我写的控 ...

  5. 847. Shortest Path Visiting All Nodes

    An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...

  6. sublime-text-how-to-jump-to-file-from-find-results-using-keyboard

    http://209.116.186.231/#newwindow=1&q=sublime+text+find+results+jump http://stackoverflow.com/qu ...

  7. Sticky Fingure安装教程

    作者:小离 官方对应Sticky Finger Kali-Pi 的介绍: Sticky Fingers Kali-Pi – The pocket size, finger friendly, lean ...

  8. fluentd 推送 mariadb audit log

    说明: mariadb audit log是 mariadb 的审计日志 目的是把日志拆分成 tab 键分隔的字段 直接附上 fluentd 配置文件 <system> log_level ...

  9. 一:使用maven构建项目

    一般情况下:使用maven构建项目有两种情况: 1:用maven构建java项目: 2:用maven构建javaweb项目: 还有一种经常需要使用到的就是用maven构建项目模块:如:一个父项目用来作 ...

  10. Excel中复杂跨行跨列数据

    XSSFWorkbook wb = new XSSFWorkbook(); // 工作表 XSSFSheet sheet = wb.createSheet("车辆使用情况统计"); ...