搜索算法

332 阅读1分钟

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
}