二分検索(JAVA実現)

13807 ワード

注意:二分検索法は、秩序化された配列の考え方分析にしか使用できません.1、まず、この配列の中間の下付きmid=(left+right)/2を決定し、検索するべき数findValとarr[mid]を比較します.1)findVal>arr[mid]なら、数の右側に再帰的に検索します.
いつ終わりますか?(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>();
		}
	}