Java二分查找

二分查找可用於對有序的數列進行查找數組

二分查找思路:bash

  1. 規定要查找的值k可能在數組arr內下標啊i,j
  2. 計算區間啊i,j的中間點m若k<arr[m],將區間縮小爲i,m,繼續二分查找
  3. 若k>arr[m],將區間縮小爲m,j繼續二分查找
  4. 若k==arr[m],則找到元素位於位置m

二分查找代碼測試

package BinartSearch;

public class BinarySearch {

	public int binarySearch(int[] arr ,int k) {
		int i=0;
		int j=arr.length;
		
		while(i<j) {
					
			int m =i+(j-i)/2;//int m =(i+j)/2;可能致使溢出
			if(k<arr[m]) {
				j=m;
			}
			else if (k>arr[m]) {
				i=m+1;
			}
			else {
				return m;
			}
			
		}
		return -1;
	}
	
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BinarySearch Binary =new BinarySearch();
	
		System.out.println(Binary.binarySearch(new int[] {1,2,3,4,5}, 1));
		System.out.println(Binary.binarySearch(new int[] {1}, 1));
		System.out.println(Binary.binarySearch(new int[] {}, 1));
		System.out.println(Binary.binarySearch(new int[] {1,2}, 1));
		System.out.println(Binary.binarySearch(new int[] {1,2}, 2));

		
	}
	

}

複製代碼

分析ui

程序代碼使用[i,j),半開半閉區間的好處spa

  1. [a,b)+[b,c)=[a,c]
  2. b-a=len([a,b))
  3. [a-a)==>empty range

取中值使用到int m =i+(j-i)/2而不使用int m =(i+j)/2,是由於當i、j很大的時候會使得i+j溢出code

總結class

二分查找的實現整體來講比較好理解,但要注意兩個方面,一個邊界值,另外一個是測試用例的選取。程序

相關文章
相關標籤/搜索