【前端算法】折半查找

1、折半查找的原理
  折半查找用於對排好序的數組進行查找。其原理是:從數組的中間元素開始,與要查找的元素進行比較,如果相等,則中間元素爲查找元素;如果大於中間元素,則在大於中間元素的那半部分數組中進行查找;如果小於中間元素,則在另一半數組中查找,如果沒有,則跳出查找過程,並返回提示信息。
2、實現

function binarySearch (arr) {
    var len = arr.length;
    if(len == 1) return arr[0];//數組中只有一個數,則返回當前值

    // arr[0] * arr[len - 1] > 0 表示數組中的數全爲負數或者全爲整數
    if(arr[0] * arr[len - 1] >= 0) {
        if(arr[0] >= 0) {
            return arr[0];
        } else if(arr[len - 1] < 0) {
            return arr[len - 1];
        }
    }

    // arr[0] * arr[len - 1] < 0 表示數組中有正有負
    if (arr[0] * arr[len - 1] < 0) {
        var low = 0,
            high = len -1,
            mid = Math.floor((low + high) / 2);

        var midValue = Math.abs(arr[mid]);
        while (low <= high) {
            if(midValue < Math.abs(arr[mid - 1]) && midValue < Math.abs(arr[mid + 1])) {
                // 如果當前數值的絕對值比與他相鄰的兩個數據的絕對值都小,則該值爲絕對值最小的值。
                return arr[mid];
            } else {
                if(midValue < Math.abs(arr[mid - 1]) && midValue > Math.abs(arr[mid + 1])) {
                    // 如果當前數值的絕對值小於左邊相鄰數據的絕對值,但是大於右邊相鄰數據的絕對值,則應該在右邊尋找最小值
                    low = mid + 1;
                    mid = Math.floor((low + high) / 2);
                    midValue = Math.abs(arr[mid]);
                } else if (midValue > Math.abs(arr[mid - 1]) && midValue < Math.abs(arr[mid + 1])) {
                    // 如果當前數值的絕對值大於左邊相鄰數據的絕對值,但是小於右邊相鄰數據的絕對值,則應該在左邊尋找最小值
                    high = mid - 1;
                    mid = Math.floor((low + high) / 2);
                    midValue = Math.abs(arr[mid]);
                }
            }
        }
    }
}

var arr = [0, 4, 7, 10];
var minValue = binarySearch(arr);
console.log(minValue);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章