[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 ...
随机推荐
- easyui-layout系列之布局(1)
1.Layout布局 通过 $.fn.layout.defaults 重写默认的 defaults. 布局(layout)是有五个区域(北区 north.南区 south.东区 east.西区 wes ...
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...
- python salt 实现windows账户自动化
import random import string import json import logging import time import os import sys def usage(): ...
- linux parallel rsync 拷贝N多文件
先来个对比图看一下, 左边图是普通 rsync 目录拷贝, 右边图是借助 parallel 工具并发起了多个 rsync centos6.5安装 parallel #!/bin/bash # Inst ...
- Elasticsearch地理位置总结
更多内容请参考 : https://www.felayman.com 翻译版本:https://es.xiaoleilu.com/310_Geopoints/00_Intro.html 官方原文:ht ...
- Pyplot绘图的格式
字符 颜色 ‘b’ 蓝色,blue ‘g’ 绿色,green ‘r’ 红色,red ‘c’ 青色,cyan ‘m’ 品红,magenta ‘y’ 黄色,yellow ‘k’ 黑色,black ‘w’ ...
- Cookie、Session和Cache
一.Cookie Cookie是保存客户端的一组数据,主要用来保存用户的个人信息,主要存放浏览器请求服务器时的请求信息,这些信息是非敏感信息.主要用于当用户访问您的系统时,应用程序可以检索以前存储的信 ...
- Python面试题整理-更新中
几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...
- 【xsy1097】 拼图 构造题
题目大意:请你使用n个图形拼成一个矩形.要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成.②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上. 数据 ...
- POJ 2291
#include<iostream> #include<stdio.h> using namespace std; int compare(void const *,void ...