[javaSE] 数组(查找-二分查找)
前提数组必须是有序的
定义最小,最大,中间的角标索引
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] 数组(查找-二分查找)的更多相关文章
- 【转】Java实现折半查找(二分查找)的递归和非递归算法
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- PHP-----二维数组和二分查找
二维数组由行和列组成.由arr[$i][$j]表示,先后表示行和列,类似于坐标点. 打印二维数组-----通过两次遍历,第一次遍历每一行,第二次遍历每一行的具体元素,并且通过使用count($arr[ ...
- java 13-1 数组高级二分查找
查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...
- leetcode旋转数组查找 二分查找的变形
http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivo ...
- Java数据结构和算法总结-数组、二分查找
前言:在平时开发中数组几乎是最基本也是最常用的数据类型,相比链表.二叉树等又简单很多,所以在学习数据和算法时用数组来作为一个起点再合适不过了.本篇博文的所有代码已上传 github ,对应工程的 ar ...
- [c/c++] programming之路(15)、多维数组和二分查找法,小外挂
一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...
- [算法][LeetCode]Search a 2D Matrix——二维数组的二分查找
题目要求 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...
- [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找
一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...
随机推荐
- odoo:开源ERP/安装和初始设置
1.1 Odoo的结构 Odoo使用Web浏览器来访问Odoo服务,因此你的Odoo服务器可以部署在较远的地方(如另外一个城市),用户的计算机上只需安装谷歌.火狐或 IE9 以上的浏览器,所以Web客 ...
- PhoneGap原理
http://www.oschina.net/question/213217_46380
- rabbitMQ的简单实例——amqp协议带数据回写机制
rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...
- Mysql 练习题一
库操作: 1. 创建 数据库 create database db1; 2. 使用数据库 use db1 3. 查看表 show tables; 4. 删除 drop database db1 ...
- Day 22 面向对象知识.
https://www.cnblogs.com/bigberg/p/7252349.html #类方法,静态方法, 属性方法. 类有两种作用:属性引用 和实例化.属性引用(类名.属性)class pe ...
- CRT和EXCRT简单学习笔记
中国剩余定理CRT 中国剩余定理是要求我们解决这样的一类问题: \[\begin{cases}x\equiv a_1\pmod {b_1} \\x\equiv a_2 \pmod{b_2}\\...\ ...
- 【新题】ocp 062 2019年考试新题-3
3.A database is open read write and the instance has multiple sessions some of which have active tra ...
- 任务查询系统(cqoi2015,bzoj3932)(主席树)
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组\((S_i,E_i,P_i)\)描述,\((S_i,E_i,P_i)\)表示任务从第 ...
- java的数据类型、自动拆装箱、字面量
java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型) 值类型分为 1,整数类型(byte,short,int,long) 2,浮点类型(float,double) 3, ...
- 为 Apache 配置 UTF-8 中文编码
为 Apache 配置 UTF-8 中文编码 cat /etc/httpd/conf/httpd.conf | grep -n utf -C2 30-# 31-ServerRoot "/et ...