1. 线性搜索
从头开始和要查找的元素作比较,知道找到目标元素位置。
2. 二分搜索
- 将数组排序
- 取数组中间值,用中间值和目标值作比较。
- 如果选中值是待搜索值,那么算法执行完毕(值找到了)
- 如果中间值大于目标值,中间值左侧的值,执行第2步和第3步
- 如果中间值小于目标值,中间值右侧的值,执行第2步和第3步
2.1 迭代
function binarySearch(array, key, compareFn = defaultCompareFn) {
array = quickSort(array, compareFn);
let low = 0;
let high = array.length - 1;
while (lesserOrEquals(low, high)) {
const mid = Math.floor((low + high) / 2);
const compare = compareFn(array[mid], key);
if (compare === COMPARE.LESS_THAN) {
low = mid + 1;
}
else if (compare === COMPARE.BIGGER_THAN) {
high = mid - 1;
}
else {
return array[mid];
}
}
return -1;
}
function lesserOrEquals(a, b, compareFn = defaultCompareFn) {
const compare = compareFn(a, b);
return compare === COMPARE.EQUALITY || compare === COMPARE.LESS_THAN;
}
2.2 递归
function binarySearch(array, key, compareFn = defaultCompareFn) {
const low = 0;
const high = array.length - 1;
array = quick(array, key, compareFn);
return array[binarySearchRecursive(array, key, low, high, compareFn)];
}
function binarySearchRecursive(array, key, low, high, compareFn) {
if (low <= high) {
const mid = Math.floor((low + high) / 2);
const compare = compareFn(array[mid], key);
if (compare === COMPARE.LESS_THAN) {
return binarySearchRecursive(array, key, mid + 1, high, compareFn);
}
else if (compare === COMPARE.BIGGER_THAN) {
return binarySearchRecursive(array, key, low, mid - 1, compareFn);
}
else {
return mid;
}
}
else {
return -1;
}
}