# 数组中查找

数组自身提供一些查找方法,这里自己手写一个算法进行查找


const arr = [1, 3, 2, 5, 4, 8, 5, 6, 9, 7];
     
function search(nums, target) {
  const sort_arr = nums.map((val, index) => ({index, val}))
                      .sort((a, b) => a.val - b.val);
  function fn(temp_arr) {
    const midI = Math.floor(temp_arr.length/2);
    const midV = temp_arr[midI].val;
    if (+midV === +target) {
      return temp_arr[midI].index;
    }
    // 未找到
    if (+midI === 0) {
      return -1;
    }
    // 二分
    if (+midV > +target) {
      const temp = temp_arr.slice(0, midI);
      return fn(temp);
    }
    if (+midV < +target) {
      const temp = temp_arr.slice(midI);
      return fn(temp);
    }
  }
  return fn(sort_arr);
}

console.log(search(arr, 8)); // 5

WARNING

上面算法,对无序数组做了排序,然后用二分法进行查找。 实际上:如果是无序数组,则直接遍历数组进行查找,时间复杂度为O(n),使用上面方法后,排序+二分时间负责度反而比O(n)要大 如果是有序数组,则使用二分法比较好,这样时间复杂度就是O(log2(n))