1. 顺序搜索
顺序搜索或线性搜索是最基本的搜索算法。他的机制是,将每一个数据结构中的元素和我们要找的元素做比较。顺序搜索也是最低效的一种搜索算法。
const DOES_NOT_EXIST = -1
function defaultEquals(a, b) {
return a === b;
}
function sequentialSearch(array, value, equalsFn = defaultEquals) {
for (let i = 0; i < array.length; i++){
if (equalsFn(value, array[i])) {
return 1
}
}
return DOES_NOT_EXIST
}
2. 二分搜索
这个算法要求被搜索的数据结构已排序。以下是该算法遵循的步骤。
- 选择数组的中间值。
- 如果选中值是待搜索值,那么算法执行完毕(值找到了)
- 如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找(较小)。(4) 如果待搜索值比选中值要大,则返回步骤 1并在选种值右边的子数组中寻找(较大)。
function binarySearch(array, value) {
const sortedArray = quickSort(array)
let low = 0
let high = sortedArray.length - 1
while (low <= high) {
const mid = Math.floor((low + high) / 2)
const element = sortedArray[mid]
if (element < value) {
low = mid + 1
} else if (element > value) {
high = mid - 1
} else {
return mid
}
}
return DOES_NOT_EXIST
}
3. 内插搜索
这个算法要求被搜索的数据结构已排序。以下是该算法遵循的步骤:
- 使用position 公式选中一个值;
- 如果这个值是待搜索值,那么算法执行完毕(值找到了);
- 如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找(较小);(4)如果待搜索值比选中值要大,则返回步骤1并在选种值右边的子数组中寻找(较大)
function defaultDiff(a, b) {
return Number(a) - Number(b)
}
function interpolationSearch(array, value, diffFn = defaultDiff) {
const { length } = array
let low = 0
let high = length - 1
let position = -1
let delta = -1
while (low <= high && value >= array[low] && value <= array[high]) {
//如果查找的值更接近array[high]则查找position位置旁更大的值
//如果查找的值更接近array[low]则查找position位置旁更小的值
delta = diffFn(value, array[low]) / diffFn(array[high], array[low])
position = low + Math.floor((high - low) * delta)
if (array[position] === value) {
return position
}
if (array[position] < value) {
low = position + 1
} else {
high = position - 1
}
}
return DOES_NOT_EXIST
}
4. 随机算法
function swap(array, a, b) {
;[array[a], array[b]] = [array[b], array[a]]
}
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const randomIndex = Math.floor(Math.random() * (i + 1))
swap(array, i, randomIndex)
}
return array
}