Java二分查找

相關代碼

二分法查找

//二分查找(折半查找)

//要求數組是個有序數組

public class BinarySearch {

public static void main(String[] args) {

int[] arr={1,2,5,7,8,9,10,10,18,20};

int left=0;

int right=arr.length-1;

int res=binarySearch(arr, 10,right,left);

if(res==-1){

System.out.println("沒找到!");

}else{

System.out.println("找到了,下標是"+res);

}

}

public static int binarySearch(int[] arr,int value,int right,int left){

if(right

return -1;

}

int mid=(right+left)/2;

if(arr[mid]>value){

return binarySearch(arr,value,mid-1,left);

}else if(arr[mid]

return binarySearch(arr,value,right,mid+1);

}else{

return mid;

}

}

}

這個數組第6位是10,第7位也是10,返回的是下標7。

這是因爲第7位先被找到,所以就直接被返回了。出入金流程

如果想讓你查找數字在數組中的位數都返回,比如上面這條代碼查找10,返回 6 ,7。那麼請看下面代碼。

二分法的功能完善

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Scanner;

//二分查找的優化

public class BinarySearch2 {

public static void main(String[] args) {

int[] arr={1,2,5,5,5,5,6,8};

System.out.println("請輸入你想查找的值");

Scanner scanner=new Scanner(System.in);

int value=scanner.nextInt();

int left=0;

int right=arr.length-1;

List reaList=binarySearch2(arr,value,left,right);

System.out.println(reaList);

}

public static List binarySearch2(int[] arr,int value,int left,int right){

//如果找不到,返回一個空的ArrayList

if(right

return new ArrayList();

}

int mid=(left+right)/2;

if(arr[mid]>value){

return binarySearch2(arr,value,left,mid-1);

}else if(arr[mid]

return binarySearch2(arr,value,mid+1,right);

}else{

List resList=new ArrayList();

//先找左邊的

int temp=mid-1;

while (true){

if(temp<0||arr[temp]!=value){

break;

}

resList.add(temp);

temp--;

}

//把中間的mid放進去

resList.add(mid);

//開始找右邊

temp=mid+1;

while(true){

if(temp>right||arr[temp]!=value){

break;

}

resList.add(temp);

temp++;

}

return resList;

}

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章