二分查找 / 折半查找的實現及其變種 -- JavaScript版

var arr = [1,3,4,6,6,6,8,9,13,15];
console.log(arr);

//二分查找 / 折半查找
function binarysearch(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key === array[mid]) {
            return mid;
        }
        if (key < array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return -1;
}
let index = binarysearch(arr, 2);
console.log(index);


//查找第一個與key值相等的元素下標
function binarySearchFirst(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key <= array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    if (arr[left] === key) return left;
    return -1;
}
console.log(binarySearchFirst(arr, 6));

//查找第一個大於等於key值的元素下標
function binarySearchFirstGreaterOrEqual(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key <= array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    if (arr[left] >= key) return left;
    return -1;
}
console.log(binarySearchFirstGreaterOrEqual(arr, 6));

//查找第一個大於key值的元素下標
function binarySearchFirstGreater(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key < array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    if (arr[left] > key) return left;
    return -1;
}
console.log(binarySearchFirst(arr, 6));

//查找最後一個與key值相等的元素下標
function binarySearchLast(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key < array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    if (right >= 0 && arr[right] === key) return right;
    return -1;
}
console.log(binarySearchLast(arr, 6));

//查找最後一個小於等於key值的元素下標
function binarySearchLastLessOrEqual(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key < array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    if (right >= 0 && arr[right] <= key) return right;
    return -1;
}
console.log(binarySearchLastLessOrEqual(arr, 6));

//查找最後一個小於等於key值的元素下標
function binarySearchLastLess(array, key) {
    if (array.length === 0) return -1;
    let left = 0;
    let right = array.length - 1;
    while (left <= right) {
        let mid = parseInt((left + right) / 2);
        if (key <= array[mid]){
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    if (right >= 0 && arr[right] < key) return right;
    return -1;
}
console.log(binarySearchLastLess(arr, 6));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章