[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 ...
随机推荐
- 使用session的监听器获取当前在线人数
1首先在web.xml中配置Session的监听器 2创建监听器并且继承HttpSessionListener 3.在jsp中导入监听器 4.获取当前在线人数 5.配置到公共网络(使用natapp的免 ...
- Flask系列02--Flask中的request
一.Flask中的request方法 1.数据相关 #flask中request,render_template等方法要通过引包的方式引入 from flask import request re ...
- python脚本 读取excel格式文件 并进行处理的方法
一.安装xlrd模块 pip install xlrd 二.读取excel文件 try: excel_obj = xlrd.open_workbook("文件路径") except ...
- 六,apache修改默认根文件路径
1,安装完apache后,项目默认根路径是E:\Program Files\AppServ\www. 默认根路径在httpd.conf中默认配置过了,我们可以通过修改配置文件改变项目默认根路径. Do ...
- 深入set和dict
一. 浅拷贝和深拷贝 浅拷贝:就是创建一个具有相同类型,相同值但不同id的新对象. 浅拷贝产生的新对象中可变对象的值在发生改变时,会对原对象的值也做出改变,因为这些值是同一个引用. a = [1 ...
- JS: 数据结构与算法之栈
栈 先来看一道题 Leetcode 32 Longest Valid Parentheses (最长有效括号) 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 ...
- 【xsy1172】 染色 dp
题目大意:现有$n$条排成一行的木板,每个木板有一个目标颜色.你每次能将一个区间内的木板分别染成它们的目标颜色,而这次染色的代价为这个区间内不同目标颜色的木板的数量的平方.问将全部木板染成目标颜色的最 ...
- SVN的安装和使用手册
下载`TortoiseSVN 官网下载址:https://www.visualsvn.com/visualsvn/download/tortoisesvn/ 下载完成后是这样的 安装TortoiseS ...
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- (转)linux如何让历史记录不记录敏感命令
有时候为了服务器安全,防止别人窥探我们输入的命令,我们可以清空历史记录,而更多的时候,我们选择的是在输入特殊命令时候,强制历史记录不记住该命令.实验方法:先执行export HISTCONTROL=i ...