[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();
时间: 2024-09-30 20:10:11

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

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

http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return it

爪哇国新游记之二十七----数组的二分查找

代码: import java.util.ArrayList; import java.util.List; public class Bit { int max; int min; int[] arr; public Bit(int[] arrInput) { // 找出极值 for (int i = 0; i < arrInput.length; i++) { if (max < arrInput[i]) { max = arrInput[i]; } if (min > arrInp

二分查找 数组的二分查找

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 1083: 数组的二分查找 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1646  Solved: 641[Submit][Status][Web Board] Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output 一个整数(表示x的位置,若

9-2-折半查找/二分查找-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 折半查找/二分查找 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包      

查找 —— 二分查找[递归+非递归]

二分查找 二分查找是对一组有序序列进行查找.根据要查找的k和序列中间元素比较,动态的移动查找范围.以对折的方式缩小查找范围. 递归方式: def binarySearch(A,left,right,k): if left<= right: mid =(left+right)//2 if A[mid] == k: return mid if A[mid]>k: return binarySearch(A,left,mid-1,k) #此处要返回函数运行结果而不是仅仅调用函数 else: retu

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

PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键词ID获取关键词等.虽然以上需求都可以在原始建表时,通过冗余数据来解决.但仍有部分业务存的只是关联表的ID,数据分析时需要频繁的查表. 所读的表存在共同的特点 数据几乎不会变更 数据量适中,从一万到100多万,如果全加载到内存也不太合适. 纠结的地方 在做数据分析时,需要十分频繁的读这些表,每秒有可

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列

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

一.多维数组 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int num[3][4]; 6 int i,j; 7 for (i = 0; i < 3; i++) 8 { 9 for (j = 0; j < 4; j++) 10 { 11 num[i][j]=4*i+j+1; 12 printf("%-3d",num[i][j]); 13 } 14 printf("\

有序数组的二分查找

二分查找的优点是比较次数少,查找速度快,但是在查找之前必须建立有序表.另外,二分查找只适用于顺序存储的有序表,而不适用于链接存储的有序表. 假设:给定一个按从小到大排序的数组P,对分查找某个元素的位置. 二分查找的过程为首先将x和数组的中间项进行比较,若x小于中间项的值,则在线性表的前半部分进行二分查找:若x大于中间项的值,则在线性表的后半部分进行二分查找:若x等于中间项的值,则查找结束.若待二分的子表长度为0时仍然没有找到这个元素,则说明数组中没有x. java代码 <span style=&qu