演算法(Java實現)—— 二分搜尋演算法
阿新 • • 發佈:2020-12-16
二分搜尋演算法
有序數列才可用二分查詢演算法
思路分析
思路分析
-
首先確定該陣列的中間下標mid = (left + right)/ 2
-
然後讓需要查詢的數findVal和arr【mid】比較
-
findVal > arr[mid],向右查詢
-
findVal < arr[mid],向右查詢
-
findVal == arr[mid],找到,返回
-
-
結束遞迴的條件
-
找到就結束
-
遞迴完整個陣列,未找到,結束遞迴,left > right
-
二分查詢遞迴演算法
基本寫法
public static int binarySearch(int[] arr,int left,int right,int findVal){
if (left > right){
return -1;
}
//確定中間陣列的下標
int mid = (left + right)/2;
int midVal = arr[mid];
//與中間陣列比較
if (findVal > midVal){//向右查詢
return binarySearch(arr,mid+1,right,findVal);
}else if (findVal < midVal){
return binarySearch(arr,left,mid-1,findVal);
}else {
return mid;
}
}
新需求
當一個數組中有多個相同的數值是 ,將所有數值都查到
程式碼實現
package com.why.search;
import com.sun.jdi.PathSearchingVirtualMachine;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
import java.util.logging.Level;
/**
* @Description TODO 當一個數組中有多個相同的數值是 ,將所有數值都查到,使用二分查詢
* @Author why
* @Date 2020/11/1 16:35
* Version 1.0
**/
public class NewBinarySearch {
public static void main(String[] args) {
int[] arr = {1,8,8,10,10,10,10,11};
List res = newBinarySearch(arr, 0, arr.length - 1, 8);
if (!res.isEmpty()){
System.out.println(res);
}else {
System.out.println("未找到");
}
}
/**
* 二分查詢查詢多條資料
*
* 思路:
* 找到mid值時,不要馬上返回
* 向mid 索引值的左邊掃描將所有滿足查詢值的元素下標加入到集合
* 向右掃描將所有滿足查詢值的元素下標加入到集合
* @param arr
* @param left
* @param right
* @param findVal
* @return
*/
public static List<Integer> newBinarySearch(int[] arr, int left, int right, int findVal){
if (left > right){
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if (findVal > midVal){
return newBinarySearch(arr,mid + 1,right,findVal);
}else if (findVal < midVal){
return newBinarySearch(arr,left,mid - 1,findVal);
}else {
List<Integer> resIndexList = new ArrayList<>();
//向左邊掃描
int temp = mid - 1;
while (true){
if (temp < 0 ||