最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于二分法查找Java的實(shí)現(xiàn)及解析

 更新時(shí)間:2022年07月14日 16:04:57   作者:空指針異常1  
這篇文章主要介紹了關(guān)于二分法查找Java的實(shí)現(xiàn)及解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

二分法查找

概述

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。

但是,折半查找要求線性表必須采用順序存儲(chǔ)結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列。

歸并排序即運(yùn)用了二分法的思想。首先需要一個(gè)由小到大排序好的數(shù)組,先對(duì)比中間的值,如果比要找的大,則向前找,取中間值前面的一半再找中間值再對(duì)比。

如果比要找的小,則向后找,取中間值后面的一半再取中間值再對(duì)比。

遞歸實(shí)現(xiàn)

這里,我使用了遞歸的方法進(jìn)行實(shí)現(xiàn)。

首先需要確認(rèn)查找的范圍,即有一個(gè)左索引和右索引,每次取(left+right)/2為中間值,比較要查找的元素和中間值的大小,若中間值大,則向前找,即遞歸范圍為left ,mid-1。反之向右找,即遞歸范圍mid+1,right。若相等即為找到。

但是需要繼續(xù)向此索引的前后找找看有沒有和其相等的值,一并加入到集合中,最后返回這個(gè)集合。

遞歸實(shí)現(xiàn)代碼

package search;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
    public static void main(String[] args) {
        int[] array = {1,1,1,2,3,4,5,6,7};
        List<Integer> integers = binarySearch(array, 0, array.length - 1, 1);
//        for (Integer integer : integers) {
//            System.out.print(integer+ " ");
//        }
        System.out.println(integers);
    }
    public static List<Integer> binarySearch(int[] array, int left, int right, int value){
        //如果左索引大于右索引,則說明全部遍歷完了,也沒有找到相應(yīng)的值,返回空集合即可
        if (left>right){
            return new ArrayList<Integer>();
        }
        //獲取中間值的下標(biāo)(二分)
        int mid = (left+right)/2;
        //如果要找的值比中間值小,則繼續(xù)向左找
        if (value < array[mid]){
            return binarySearch(array, left, mid-1, value);
        //要找的值比中間值小大,則向右找
        }else if (value > array[mid]){
            return binarySearch(array, mid+1, right, value);
        //否則,說明相等,找到了
        }else {
            //找到一個(gè),還需要向左右找找看有沒有相同的值
            List<Integer> resultList = new ArrayList();
            //向左循環(huán)找,如果有,則加入到集合中
            int temp = mid - 1;
            while (temp>=0 && array[temp] == value){
                resultList.add(temp);
                temp -= 1;
            }
            //向右循環(huán)找,如果有,則加入到集合中
            temp = mid + 1;
            while (temp < array.length && array[temp] == value){
                resultList.add(temp);
                temp += 1;
            }
            //將一開始找到的那個(gè)索引頁加入到集合中。
            resultList.add(mid);
            return resultList;
        }
    }
    
    //以下這段代碼來自百度百科,供大家參考。
    public static int binarySearch(Integer[] srcArray, int des) {
        //定義初始最小、最大索引
        int start = 0;
        int end = srcArray.length - 1;
        //確保不會(huì)出現(xiàn)重復(fù)查找,越界
        while (start <= end) {
            //計(jì)算出中間索引值
            int middle = (end + start)>>>1 ;//防止溢出
            if (des == srcArray[middle]) {
                return middle;
                //判斷下限
            } else if (des < srcArray[middle]) {
                end = middle - 1;
                //判斷上限
            } else {
                start = middle + 1;
            }
        }
        //若沒有,則返回-1
        return -1;
    }
}

循環(huán)實(shí)現(xiàn)代碼(非遞歸)

package search;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @Author: sshdg
 * @Date: 2020/9/21 9:22
 */
public class BinarySearch2 {
    public static void main(String[] args) {
        int[] array = {1,1,1,1,1,2,3,4,5,6,7};
        System.out.println(BinarySearch2.binarySearch(array, 7));
    }
    public static List<Integer> binarySearch(int[] array, int key){
        List<Integer> resultList = new ArrayList<>();
        int start = 0;
        int end = array.length - 1;
        while (start <= end){
            int mid = (start + end) / 2;
            int midValue = array[mid];
            if (key > midValue){
                //key比中間值大。向右找
                start = mid + 1;
            } else if (key < midValue){
                //key比中間值小。向左找
                end = mid - 1;
            } else {
                //否則就找到了
                //先向左找有沒有相同值
                int temp = mid -1;
                while (temp >= start && array[temp] == key){
                    resultList.add(temp);
                    temp -= 1;
                }
                //將一開始找到的加入結(jié)果集
                resultList.add(mid);
                //再向右找找有沒有相同值
                temp = mid + 1;
                while (temp <= end && array[temp] == key){
                    resultList.add(temp);
                    temp += 1;
                }
                break;
            }
        }
        return resultList;
    }
}

二分法查找(遞歸、循環(huán))

public class BinarySearch {
    /**
     * @author JadeXu
     * @// TODO: 2020/12/7 二分查找
     * 思路:
     * 1、獲取數(shù)組的中間值,先獲取下標(biāo),方便多次查找
     * 奇數(shù)位的數(shù)組直接獲取中間位,偶數(shù)位的數(shù)組獲取中間的第一位或第二位都可,一般獲取第一位(因?yàn)榕c奇數(shù)位獲取中間值的方法一樣)
     * 2、獲取查找的區(qū)間范圍,start:區(qū)間開始的下標(biāo),end:區(qū)間結(jié)束的下標(biāo)
     * 3、判斷查找的數(shù)和中間位的數(shù)是否相同
     * 相同時(shí),直接返回需要的數(shù)據(jù),跳出方法
     * 大于時(shí),即數(shù)可能在中間值右邊的區(qū)間內(nèi),此時(shí)start = mid+1,即mid往后移一位,就得到了中間值右邊區(qū)間的開始下標(biāo)
     * 小于時(shí),即數(shù)可能在中間值左邊的區(qū)間內(nèi),此時(shí)end = mid-1,即mid往前移一位,就得到了中間值左邊區(qū)間的結(jié)束下標(biāo)
     * 當(dāng)一個(gè)區(qū)間里,開始下標(biāo)小于等于結(jié)束下標(biāo)時(shí),該區(qū)間才是有效區(qū)間,才能繼續(xù)查找。否則無效,返回找不到,跳出方法
     */
    //循環(huán)
    /**
     * @param arr 已經(jīng)升序好的int[]
     * @param num 需要查找的數(shù)字
     * @return 找到則返回下標(biāo),沒找到則返回-1
     */
    private static int binarySearchByCycle(int[] arr,int num) {
        int start = 0;
        int end = arr.length - 1;
        while (start <= end){
            int mid = (start + end) / 2;
            if(num == arr[mid]){
                return mid;
            }else if(num > arr[mid]){
                start = mid + 1;
            }else {
                end = mid - 1;
            }
        }
        return -1;
    }
    //遞歸
    /**
     * @param arr 已經(jīng)升序好的int[]
     * @param num 需要查找的數(shù)字
     * @param start 區(qū)間開始下標(biāo)
     * @param end 區(qū)間結(jié)束下標(biāo)
     * @return 找到則返回下標(biāo),沒找到則返回-1
     */
    private static int binarySearchByRecursion(int[] arr,int num,int start,int end) {
        int mid = (start + end) / 2;
        if(num == arr[mid]){
            return mid;
        }else if(num > arr[mid]){
            start = mid + 1;
        }else {
            end = mid - 1;
        }
        if(start <= end){
            mid = binarySearchByRecursion(arr,num,start,end);  //遞歸繼續(xù)尋找
        }else {
            mid = -1;
        }
        return mid;
    }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合MP通過Redis實(shí)現(xiàn)二級(jí)緩存方式

    SpringBoot整合MP通過Redis實(shí)現(xiàn)二級(jí)緩存方式

    這篇文章主要介紹了SpringBoot整合MP通過Redis實(shí)現(xiàn)二級(jí)緩存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • springboot+redis 實(shí)現(xiàn)分布式限流令牌桶的示例代碼

    springboot+redis 實(shí)現(xiàn)分布式限流令牌桶的示例代碼

    這篇文章主要介紹了springboot+redis 實(shí)現(xiàn)分布式限流令牌桶 ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信

    Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程里通過套接字實(shí)現(xiàn)單向通信的方法及相關(guān)實(shí)例,屬于網(wǎng)絡(luò)編程入門程序,雖然簡(jiǎn)單,但具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot集成minio實(shí)現(xiàn)文件上傳和刪除功能

    SpringBoot集成minio實(shí)現(xiàn)文件上傳和刪除功能

    這篇文章主要介紹了SpringBoot集成minio實(shí)現(xiàn)文件上傳和刪除功能,詳細(xì)介紹每個(gè)功能的實(shí)現(xiàn)步驟和代碼示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Spring緩存機(jī)制實(shí)例代碼

    Spring緩存機(jī)制實(shí)例代碼

    這篇文章主要介紹了Spring緩存機(jī)制實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 基于java實(shí)現(xiàn)顏色拾色器并打包成exe

    基于java實(shí)現(xiàn)顏色拾色器并打包成exe

    這篇文章主要為大家詳細(xì)介紹了如何基于java編寫一個(gè)簡(jiǎn)單的顏色拾色器并打包成exe文件,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Java8的Lambda表達(dá)式你真的會(huì)嗎

    Java8的Lambda表達(dá)式你真的會(huì)嗎

    這篇文章主要介紹了Java8的Lambda表達(dá)式你真的會(huì)嗎,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • org.springframework.beans.BeanInstantiationException異常解決

    org.springframework.beans.BeanInstantiationException異常解決

    本文主要介紹了org.springframework.beans.BeanInstantiationException異常解決,大多數(shù)情況下,這個(gè)異常是由于簡(jiǎn)單的配置錯(cuò)誤或者代碼問題導(dǎo)致的,下面就來具體解決一下
    2024-03-03
  • SpringSecurity概念及整合ssm框架的示例詳解

    SpringSecurity概念及整合ssm框架的示例詳解

    用戶登錄系統(tǒng)時(shí)我們協(xié)助?SpringSecurity?把用戶對(duì)應(yīng)的角色、權(quán)限組裝好,同時(shí)把各個(gè)資源所要求的權(quán)限信息設(shè)定好,剩下的“登錄驗(yàn)證”、“權(quán)限驗(yàn)證”等等工作都交給SpringSecurity,對(duì)SpringSecurity整合ssm框架相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • Spring?@Cacheable讀取配置常量方式

    Spring?@Cacheable讀取配置常量方式

    這篇文章主要介紹了Spring?@Cacheable讀取配置常量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

平远县| 礼泉县| 萍乡市| 辽阳市| 阜新| 东乌珠穆沁旗| 虎林市| 镇雄县| 汉川市| 海原县| 南岸区| 镇赉县| 长泰县| 东丽区| 蕉岭县| 金塔县| 通化市| 德钦县| 博乐市| 黄浦区| 青铜峡市| 滨海县| 棋牌| 兰考县| 五峰| 陕西省| 哈巴河县| 和田县| 博湖县| 逊克县| 藁城市| 屯昌县| 拉萨市| 新蔡县| 百色市| 阳城县| 阿拉尔市| 荥阳市| 北票市| 道孚县| 浠水县|