前提数组必须是有序的

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

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

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

  1. int min,max,mid;
  2. min=0;
  3. max=arr.length-1;
  4. mid=(min+max)/2;
  5. while(arr[mid]!=key){
  6. if(key<arr[mid]){
  7.  
  8. }else if(arr[mid]<key){
  9.  
  10. }
  11. }

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

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

中间角标继续二分

  1. int min,max,mid;
  2. min=0;
  3. max=arr.length-1;
  4. mid=(min+max)/2;
  5. while(arr[mid]!=key){
  6. if(key<arr[mid]){
  7. max=mid-1;
  8. }else if(arr[mid]<key){
  9. min=mid+1;
  10. }
  11. mid=(min+max)/2;
  12. }
  13. return mid;

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

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

  1. int min,max,mid;
  2. min=0;
  3. max=arr.length-1;
  4. mid=(min+max)/2;
  5. while(arr[mid]!=key){
  6. if(key<arr[mid]){
  7. max=mid-1;
  8. }else if(arr[mid]<key){
  9. min=mid+1;
  10. }
  11. if(min>max) return -1;
  12. mid=(min+max)/2;
  13. }
  14. return mid;

java版:

  1. public class ArrayDemo {
  2.  
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. int[] arr=new int[]{1,4,6,7,8,9};
  8. System.out.println("索引:"+keySearch(arr,7));//索引:3
  9. System.out.println("索引:"+helfSearch(arr,7));//索引:3
  10. }
  11. /**
  12. * 二分查找
  13. * @param arr
  14. * @param key
  15. * @return
  16. */
  17. public static int helfSearch(int[] arr,int key){
  18. int min,max,mid;
  19. min=0;
  20. max=arr.length-1;
  21. mid=(min+max)/2;
  22. while(arr[mid]!=key){
  23. if(key<arr[mid]){
  24. max=mid-1;
  25. }else if(arr[mid]<key){
  26. min=mid+1;
  27. }
  28. if(min>max) return -1;
  29. mid=(min+max)/2;
  30. }
  31. return mid;
  32. }
  33. /**
  34. * 获取该值在数组中第一次出现的位置
  35. * @param arr
  36. * @param num
  37. * @return
  38. */
  39. public static int keySearch(int[] arr,int num){
  40. for(int i=0;i<arr.length;i++){
  41. if(arr[i]==num){
  42. return i;
  43. }
  44. }
  45. return -1;
  46. }
  47. }

PHP版:

  1. <?php
  2. class ArrayDemo{
  3. public static function main(){
  4. $arr=array(1,4,6,7,8,9);
  5. echo "索引:".ArrayDemo::keySearch($arr,7);//索引:3
  6. echo "索引:".ArrayDemo::helfSearch($arr,7);//索引:3
  7. }
  8. /**
  9. * 二分查找
  10. * @param arr
  11. * @param key
  12. * @return
  13. */
  14. public static function helfSearch($arr,$key){
  15. $min=0;
  16. $max=count($arr)-1;
  17. $mid=ceil(($min+$max)/2);
  18. while($arr[$mid]!=$key){
  19. if($key<$arr[$mid]){
  20. $max=$mid-1;
  21. }else if($arr[$mid]<$key){
  22. $min=$mid+1;
  23. }
  24. $mid=ceil(($min+$max)/2);
  25. if($min>$max) return -1;
  26. }
  27. return $mid;
  28. }
  29. /**
  30. * 获取该值在数组中第一次出现的位置
  31. * @param arr
  32. * @param num
  33. * @return
  34. */
  35. public static function keySearch($arr,$key){
  36. for($i=0;$i<count($arr);$i++){
  37. if($arr[$i]==$key){
  38. return $i;
  39. }
  40. }
  41. return -1;
  42. }
  43. }
  44.  
  45. 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. easyui-layout系列之布局(1)

    1.Layout布局 通过 $.fn.layout.defaults 重写默认的 defaults. 布局(layout)是有五个区域(北区 north.南区 south.东区 east.西区 wes ...

  2. 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

  3. python salt 实现windows账户自动化

    import random import string import json import logging import time import os import sys def usage(): ...

  4. linux parallel rsync 拷贝N多文件

    先来个对比图看一下, 左边图是普通 rsync 目录拷贝, 右边图是借助 parallel 工具并发起了多个 rsync centos6.5安装 parallel #!/bin/bash # Inst ...

  5. Elasticsearch地理位置总结

    更多内容请参考 : https://www.felayman.com 翻译版本:https://es.xiaoleilu.com/310_Geopoints/00_Intro.html 官方原文:ht ...

  6. Pyplot绘图的格式

    字符 颜色 ‘b’ 蓝色,blue ‘g’ 绿色,green ‘r’ 红色,red ‘c’ 青色,cyan ‘m’ 品红,magenta ‘y’ 黄色,yellow ‘k’ 黑色,black ‘w’ ...

  7. Cookie、Session和Cache

    一.Cookie Cookie是保存客户端的一组数据,主要用来保存用户的个人信息,主要存放浏览器请求服务器时的请求信息,这些信息是非敏感信息.主要用于当用户访问您的系统时,应用程序可以检索以前存储的信 ...

  8. Python面试题整理-更新中

    几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...

  9. 【xsy1097】 拼图 构造题

    题目大意:请你使用n个图形拼成一个矩形.要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成.②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上. 数据 ...

  10. POJ 2291

    #include<iostream> #include<stdio.h> using namespace std; int compare(void const *,void ...