二分検索(JAVA実現)
13807 ワード
注意:二分検索法は、秩序化された配列の考え方分析にしか使用できません.1、まず、この配列の中間の下付きmid=(left+right)/2を決定し、検索するべき数findValとarr[mid]を比較します.1)findVal>arr[mid]なら、数の右側に再帰的に検索します.
いつ終わりますか?(1)見つけたら終了(2)left>right
コードの実装:
コードの実装:
いつ終わりますか?(1)見つけたら終了(2)left>right
コードの実装:
public class halfSearch {
public static void main(String[] args) {
// TODO
//
int[] arr= {1,8,10,66,89,120,145,1000,1024};
//
int findVal=1024;
System.out.println(HalfSearch(arr, findVal, 0, arr.length-1));
}
public static int HalfSearch(int[] arr,int findVal,int left,int right) {
int mid=(left+right)/2; //
if(left<=right) { //
if(findVal>arr[mid]) { //
return HalfSearch(arr, findVal, mid+1, right);
}else if(findVal<arr[mid]) { //
return HalfSearch(arr, findVal, left, mid);
}else { // ,
return mid;
}
}else {
return -1;
}
}
}
改善:複数のfindValを検索することを実現し、すべての下付き考え方を得る:(1)midインデックスを見つけた後、すぐに(2)midインデックスに戻らないでください.左にスキャンする価値があります.findValを満たすすべての要素の下付きを見つけて、集合ArayListに参加します.集合ArayListに加入して(4)ArayListを返すコードの実装:
public static List<Integer> HalfSearch2(int[] arr,int findVal,int left,int right) {
int mid=(left+right)/2;
if(left<=right) {
if(findVal>arr[mid]) {
return HalfSearch2(arr, findVal, mid+1, right);
}else if(findVal<arr[mid]) {
return HalfSearch2(arr, findVal, left, mid+1);
}else {
List<Integer> indexList=new ArrayList<>();
//
int tempLeft=mid-1;
while(true) {
if(tempLeft<0||arr[tempLeft]!=findVal) {
break;
}
indexList.add(tempLeft);
tempLeft--; //
}
indexList.add(mid);
//
int tempRight=mid+1;
while(true) {
if(tempRight>arr.length-1||arr[tempRight]!=findVal) {
break;
}
indexList.add(tempRight);
tempRight++; //
}
return indexList;
}
}else {
return new ArrayList<Integer>();
}
}