java 二分查找

二分查找又稱折半查找,是一種較高效率的查找方法。

優點:比較次數少,查找速度快,平均性能好,佔用系統內存較少。

缺點:要求待查表爲有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。

算法要求:

1.必須採用順序存儲結構。

2.必須按關鍵字大小有序排列。

算法思想:
將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如果x小於a[n/2],則我們只要在數組a的左半部繼續搜索x(這裏假設數組元素呈升序排列)。如果x大於a[n/2],則我們只要在數組a的右 半部繼續搜索x

算法實現

方式一:while循環

public int binarySearch(Integer[] srcArray, int element) {
        //定義初始最大、最小索引
        int start = 0;
        int end = srcArray.length - 1;
        //確保不會越界重複查找
        while (start <= end && start <= srcArray.length - 1 && end <= srcArray.length - 1) {
            //獲取中間索引,若寫爲:middle=(start+end)/2,則會出現在當start+end的結果大於表達式結果類型所能表示的最大值時,
            // 這樣產生溢出後再 / 2 是不會產生正確結果的,
            int middle = start + (end - start) / 2;
            if (element == srcArray[middle]) {
                return middle;
                //判斷下限
            } else if (element < srcArray[middle]) {
                end = middle - 1;
                //判斷上限
            } else {
                start = middle + 1;
            }
        }
        //若沒有查找到則返回-1
        return -1;
    }

方式二:遞歸

    public int binarySearch(Integer[] srcArray, int start, int end, int element) {
        //獲取中間索引,若寫爲:middle=(start+end)/2,則會出現在當start+end的結果大於表達式結果類型所能表示的最大值時,
        // 這樣產生溢出後再 / 2 是不會產生正確結果的,
        int middle = start + (end - start) / 2;
        if (element == srcArray[middle]) {
            return middle;
        } else if (start > end) {
            return -1;
            //判斷下限
        } else if (element < srcArray[middle]) {
            end = middle - 1;
            return binarySearch(srcArray, start, end, element);
            //判斷上限
        } else {
            start = middle + 1;
            return binarySearch(srcArray, start, end, element);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章