数据结构与算法Javascript描述-检索算法

263 阅读1分钟

检索算法

检索方式分为:顺序查找和二分查找。

顺序查找

代码实现

function seqSearch(arr, data) {
    for (let i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === data) {
            return i;
        }
    }

    return -1;
}

查找最小值

function findMin(arr) {
    let min = arr[0];

    for (let i = 1, len = arr.length; i < len; i++) {
        if (arr[i] < min) {
            min = arr[i];
        }
    }

    return min;
}

查找最大值

function findMin(arr) {
    let max = arr[0];

    for (let i = 1, len = arr.length; i < len; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }

    return max;
}

使用自组织数据

function swap(arr, idx, idx2) {
    const temp = arr[idx];

    arr[idx] = arr[idx2];
    arr[idx2] = temp;
}
  1. 冒泡方式
function seqSearch(arr, data) {
    for (let i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === data) {
            if (i > 0) {
                swap(arr, i, i - 1);
                return i - 1;
            }

            return i;
        }
    }

    return -1;
}
  1. 移到队首
function seqSearch(arr, data) {
    for (let i = 0, len = arr.length; i < len; i++) {
        if (arr[i] === data) {
            // 2-8原则,远离20%的才移动到队首
            if (i > (arr.length * 0.2)) {
                swap(arr, i, 0);
                return 0;
            }

            return i;
        }
    }

    return -1;
}

二分查找

代码实现

function bindSearch(arr, data) {
    let upperBound = arr.length - 1;
    let lowerBound = 0;

    while(lowerBound <= upperBound) {
        const mid = Math.floor((upperBound + lowerBound) / 2);

        if (arr[mid] < data) {
            lowerBound = mid + 1;
        } else if (arr[mid] > data) {
            lowerBound = mid - 1;
        } else {
            return mid;
        }
    }

    return -1;
}

计算重复次数

function count() {
    let count = 0;

    const postion = bindSearch(arr, data);

    if (position > -1) {
        count++;

        for (let i = position - 1, i > 0; i--) {
            if (arr[i] === data) {
                count++;
            } else {
                break;
            }
        }

        for (let i = position + 1, len = arr.length; i < len; i++) {
            if (arr[i] === data) {
                count++;
            } else {
                break;
            }
        }
    }

    return count;
}

欢迎到前端自习群一起学习~516913974