日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现二分查找及其优化

發布時間:2025/3/13 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现二分查找及其优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Java中常用的查找算法有四種:

1.順序查找(不要求數組有序,挨個遍歷進行比對);

2.二分查找(要求數組有序);

3.插值查找;

4.斐波那契查找

本文使用遞歸思想帶來二分查找及其優化

二分查找思路分析

1.首選確定該數組中間下標?mid?=?(left?+?right)?/?2;

2.然后讓需要查找的數findVal與arr[mid]比較;
2.1?findVal?>?arr[mid]?說明要查找的數在mid的右邊,因此需要遞歸的向右查找;
2.2?findVal?<?arr[mid]?說明要查找的數在mid的左邊,因此需要遞歸的向左查找;
2.3?findVal?==?arr[mid]?說明找到,就返回

遞歸結束條件

1)找到就結束遞歸
2)遞歸完整個數組,仍然沒有找到findVal?也需要結束,即left?>?right

代碼如下:

/*** * @param arr 數組* @param left 左索引 * @param right 右索引* @param findVal 要查找的值* @return 返回所找到值的索引,如果沒有則返回-1*/public static int binarySearch(int[] arr, int left, int right, int findVal){if(left > right){return -1;}int mid = (left + right) / 2;int res = arr[mid];if(findVal > res){//向右遞歸return binarySearch(arr, mid + 1, right, findVal);}else if(findVal < res){return binarySearch(arr, left, mid - 1, findVal);}else{return mid;}}

但上述算法也有缺陷,當數組中有2個相同的值時,則只能返回其中一個的索引,無法返回所有值的索引。如下方法將上述缺陷改進,以數組{1,?8,?10,?89,?1000,?1000,?1000,?1234}?為例,找到所有1000的數組索引:

思路分析:

1.找到mid?索引值時,不要馬上返回;

2.向mid?索引值的左邊掃描,將所有滿足?1000?的元素下標,放到集合ArrayList里;

3.向mid?索引值的右邊掃描,將所有滿足?1000?的元素下標,放到集合ArrayList里;

4.將ArrayLi返回

方法體如下:

public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal){if(left > right){return new ArrayList<Integer>();}int mid = (left + right) / 2;int res = arr[mid];if(findVal > res){//向右遞歸return binarySearch2(arr, mid + 1, right, findVal);}else if(findVal < res){return binarySearch2(arr, left, mid - 1, findVal);}else{ArrayList<Integer> resIndexList = new ArrayList<Integer>();//向左掃描int temp = mid - 1;while(true){if(temp < 0 || arr[temp] != findVal){break;}//否則將temp放入到集合中resIndexList.add(temp);temp -= 1; //temp左移}resIndexList.add(mid); //將mid放入//向右掃描temp = mid + 1;while(true){if(temp > arr.length-1 || arr[temp] != findVal){break;}//否則將temp放入到集合中resIndexList.add(temp);temp += 1;}return resIndexList;}}

調用方法如下:

public static void main(String[] args){int[] arr = {1, 8, 10, 89, 1000, 1000, 1234};// int resultIndex = binarySearch(arr, 0, arr.length-1, 0);// System.out.println(resultIndex);ArrayList<Integer> resultIndex = binarySearch2(arr, 0, arr.length-1, 1000);System.out.println(resultIndex);}

打印結果為:[4, 5]

總結

以上是生活随笔為你收集整理的Java实现二分查找及其优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。