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实现二分查找及其优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现基数排序及其推导过程 Rad
- 下一篇: Java实现插值查找算法 Insert