Java基礎必備---二分法查找

/*
算法:當數據量很大適宜採用該方法。採用二分法查找時,數據需是有序不重複的。
 
基本思想:
 
假設數據是按升序排序的,對於給定值x,從序列的中間位置開始比較,
如果當前位置值等於 x,則查找成功;
若 x 小於當前位置值,則在數列的前半段中查找;
若 x 大於當前位置值則在數列的後半段中繼續查找,直到找到爲止。
 
查找 key=58
數組arr: | 10 | 16 | 38 | 58 | 118|
          ==========================
第一次:   | 10 | 16 | 38 | 58 | 118|  //min=0,max=4,mid=2,key>arr[mid],在後半段查找;
            ^         ^         ^
第二次:   | 10 | 16 | 38 | 58 | 118|  //min=3,max=4,mid=3,key==arr[mid],則key查找到;
*/
 
public static int binarySearch(int[] arr, int key)
    {
        int min = 0;   //定義小標,並初始化爲0;
        int max = arr.length-1; //定義大標,並初始化爲數組的最後的座標;
        int mid = (min+max)/2;  //定義中標,並初始化值爲(min+max)/2,比如int(0+5)/2=2l
        while(arr[mid]!=key) //當中標的值與給定的值不一樣時,
        {
            if(key>arr[mid]) //如果給定的值大於中標,
            {
                min = mid + 1;  //則小標=中標+1;比較後半段
            }else if (key<arr[mid]) //如果給定的值小於中標
            {
                max = mid - 1; //則小標=中標-1;比較後半段
            }
            if(min>max) //如果小標>大標,沒有找到給定的值;
            {
                return -1; //返回-1,代表Error
            }
            mid = (min+max)/2; //設置中標=(小標+大標)/2;
        }
        return mid; //arr[mid]==key,則返回中標;
    }
    public static void main(String[] args) 
    {
        int[] arr = new int[]{10,16,38,58,118};
        int index = binarySearch(arr,58);
        System.out.println("index="+index);
        index = binarySearch(arr,8);
        System.out.println("index="+index);
    }
#運行結果:
index=3
index=-1

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